Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // bigInt.cpp
- // CMPT 275 :: Lab 6
- #include "bigInt.h"
- bigInt::bigInt() {
- int i;
- for(i = 0; i < SIZE; i++) //Sets all the values of digits to 0.
- digits[i] = 0;
- sign = true;
- numDigits = 1;
- error1 = true;
- overflowFlag = false;
- }
- bigInt::bigInt(const char temp []) {
- int i;
- int tempSize = strlen(temp);
- numDigits = 1;
- error1 = true;
- sign = true;
- if(tempSize > 30)
- error1 = false;
- if(temp[0] == '-') { //If there's a negative symbol set the sign to false
- sign = false;
- if(tempSize > 31) //Add an extra space so the - doesn't count
- error1 = false;
- for(i = 0; i < SIZE; i++){
- if(i < tempSize - 1)
- if ( !(temp[tempSize-i - 1] >= 48 && temp[tempSize-i - 1] <= 58)){ //Check for errors
- error1 = false;
- }
- else {
- digits[i] = temp[tempSize-i-1] - '0';
- if(digits[i]!=0)
- numDigits = i+1;
- }
- else
- digits[i] = 0;
- }
- }
- else{
- for(i = 0; i < SIZE; i++){
- if(i < tempSize)
- if ( !(temp[tempSize-i-1] >= 48 && temp[tempSize-i-1] <= 58)){ //Check for errors
- error1 = false;
- }
- else {
- digits[i] = temp[tempSize-i-1] - '0';
- if(digits[i]!=0)
- numDigits = i+1;
- }
- else
- digits[i] = 0;
- }
- }
- }
- bigInt::bigInt(const string temp) {
- int i;
- int tempSize = temp.length();
- numDigits = 1;
- error1 = true;
- sign = true;
- if(tempSize > 30)
- error1 = false;
- if(temp[0] == '-') {//If there's a negative symbol set the sign to false
- sign = false;
- if(tempSize > 31)//Add an extra space so the - doesn't count
- error1 = false;
- for(i = 0; i < SIZE; i++){
- if(i < tempSize - 1)
- if ( !(temp[tempSize-i - 1] >= 48 && temp[tempSize-i - 1] <= 58)){ //Check for errors
- error1 = false;
- }
- else {
- digits[i] = temp[tempSize-i-1] - '0';
- if(digits[i]!=0)
- numDigits = i+1;
- }
- else
- digits[i] = 0;
- }
- }
- else{
- for(i = 0; i < SIZE; i++){
- if(i < tempSize)
- if ( !(temp[tempSize-i-1] >=48 && temp[tempSize-i-1] <= 58) || temp[tempSize-i-1] == '-' ){//Check for errors
- error1 = false;
- if(sign == false)
- error1 = true;
- }
- else {
- digits[i] = temp[tempSize-i-1] - 48;
- if(digits[i]!=0)
- numDigits = i+1;
- }
- else
- digits[i] = 0;
- }
- }
- }
- int bigInt::length() const {
- return numDigits; //Returns the number of digits
- }
- bool bigInt::overflow() const {
- return overflowFlag; //Overflow check
- }
- bool bigInt::error() const {
- return !error1;//Error checking
- }
- bool bigInt::negative() const {
- return !sign;//Sign checking
- }
- string bigInt::toString() const {
- string output = "";
- if(sign == false) //If there's a negative symbol it will be outputted
- output = "-";
- for(int i = numDigits - 1; i >= 0; i--) {
- if ((i) % 3 == 2 && i < numDigits - 1)
- output += ','; //Add commas
- output += digits[i] + '0';
- }
- return output;
- }
- int bigInt::compare(const bigInt& x) const {
- for(int i = SIZE - 1; i >= 0; i--){
- if(sign == false && x.sign == true)
- return -1;
- else if(x.sign == false && sign == true)
- return 1;
- else if(sign == false && x.sign == false){
- if(digits[i] > x.digits[i])
- return -1;
- else if(digits[i] < x.digits[i])
- return 1;
- }
- else if(digits[i] < x.digits[i])
- return -1;
- else if(digits[i] > x.digits[i])
- return 1;
- }
- return 0;
- }
- bigInt bigInt::add(const bigInt& x) const {
- int carry = 0;
- int i;
- bigInt output;
- for(i = 0; i < SIZE; i++) {
- int value;
- if(sign == false && x.sign == false)
- output.sign = false;
- value = digits[i] + x.digits[i] + carry;
- carry = 0;
- carry = value / 10;
- output.digits[i] = value % 10;
- if(value != 0)
- output.numDigits = i + 1;
- }
- if (output.numDigits == SIZE && carry){
- output.overflowFlag = true;
- output.numDigits = 1;
- for (i = 0; i < SIZE; i++) {
- if(output.digits[i] != 0)
- output.numDigits=i+1;
- }
- }
- return output;
- }
- bigInt bigInt::sub(const bigInt& x) const {
- int value;
- int i;
- bigInt output;
- bigInt temp;
- cout << "X num digits = " << x.numDigits << endl;
- cout << "Num digits = " << numDigits << endl;
- for(i = 0; i < SIZE; i++) {
- if(sign == false && x.sign != false){
- value = digits[i] + x.digits[i];
- output.sign = false;}
- else if(x.sign == false && sign != false)
- value = digits[i] + x.digits[i];
- // else if(digits[numDigits - 1] < x.digits[numDigits - 1] ){
- // output.sign = false;
- // if(x.digits[i] < digits[i]){
- // value = (x.digits[i] + 10) - digits[i];
- // output.digits[i] = value;
- // output.digits[i + 1] = x.digits[i + 1] - 1;
- // }
- // else if(x.digits[i] >= digits[i]){
- // value = x.digits[i] - digits[i];
- // output.digits[i] = value;
- // }
- // }
- // else if(digits[numDigits] < x.digits[x.numDigits - 1]){
- // output.sign = false;
- //
- // if(x.digits[i] < digits[i]){
- //value = x.digits[i] + 10 - digits[i];
- // output.digits[i] = value;
- //output.digits[i + 1] = x.digits[i + 1] - 1;
- // }
- // else if(x.digits[i] >= digits[i]){
- // value = x.digits[i] - digits[i];
- // output.digits[i] = value;
- // }
- //}
- else
- if(digits[i] < x.digits[i]){
- value = (digits[i] + 10) - x.digits[i];
- output.digits[i] = value;
- output.digits[i + 1] = digits[i + 1] -1;
- }
- else if(digits[i] >= x.digits[i]){
- value = digits[i] - x.digits[i];
- cout << "value" << value << endl;
- output.digits[i] = value;}
- if(value != 0)
- output.numDigits = i + 1;
- }
- if (output.numDigits == SIZE){
- output.overflowFlag = true;
- output.numDigits = 1;
- for (i = 0; i < SIZE; i++) {
- if(output.digits[i] != 0)
- output.numDigits=i+1;
- }
- }
- return output;
- }
Add Comment
Please, Sign In to add comment