面试题整理3 大数的表示及加减法问题
生活随笔
收集整理的這篇文章主要介紹了
面试题整理3 大数的表示及加减法问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在《劍指offer》面試題12中指出大數的表示時一般用字符串,用一個char型字符表示十進制數的一位。但是一個char類型最多能夠表示256個字符,而十進制數只有0~9的10個數字,這樣造成內存浪費。可以采用256進制的表示方法,這樣不會有內存空間的浪費。但是如果針對題目中以十進制打印的話,這樣還需要數據的轉換,效率太低。
空間和時間往往不能兩全其美,針對不同的需求有不同的選擇。
題目:實現兩個整形的加法。
分析:這是一個大數問題,照樣使用字符串來表示大數。
??????需要注意,正負號怎么表示,計算時怎樣處理。同時注意邊界和效率問題。
思路:
?? 數據的表示結構,一個字符串表示權重,一個標志表示正負號。
????(1)若其中一個為0,則結果為另一個。
????(2)若兩數同號,保留符號,將權值相加即可。
????(3)若兩數異號,則先比較兩數的權重大小:
?????????????????????若權重相同,則返回0;
?????????????????????若一大一小,則保留權重大的符號,值為大值減小值。
小女不才,寫了一個大數的加法運算,測試通過,還望大家指正。
#include "stdafx.h" #include <iostream> #include <string> using namespace std;struct BigInt{bool isNegative;char* data; // always positiveBigInt():isNegative(false),data(NULL){}BigInt(bool isNegative, char data[]){this->isNegative = isNegative;this->data = data;} };char* subtractCharArray( const char param1[], const char param2[]); char* addCharArray( const char param1[], const char param2[]); BigInt addBigInt(const BigInt& parameter1, const BigInt& parameter2); int compare(const char param1[],const char param2[] );BigInt addBigInt(const BigInt& parameter1, const BigInt& parameter2) {BigInt resultBigInt;//if nullif(parameter1.data == NULL || parameter2.data == NULL){cout << "parameter is null" << endl;return resultBigInt;}// if one is zeroif(compare(parameter1.data,"0") == 0 ){resultBigInt.data = parameter2.data;return resultBigInt;}if(compare(parameter2.data,"0") == 0 ){resultBigInt.data = parameter1.data;return resultBigInt;}// the sign is sameif( parameter1.isNegative == parameter2.isNegative){resultBigInt.isNegative = parameter1.isNegative;resultBigInt.data = addCharArray(parameter1.data,parameter2.data);return resultBigInt;}// the sign is not sameswitch(compare(parameter1.data,parameter2.data)){case 1: //greaterresultBigInt.isNegative = parameter1.isNegative;resultBigInt.data = subtractCharArray(parameter1.data,parameter2.data);break;case -1: //smallerresultBigInt.isNegative = parameter2.isNegative;resultBigInt.data = subtractCharArray(parameter2.data,parameter1.data);break;case 0:resultBigInt.data = new char[2];resultBigInt.data[0] = '0';resultBigInt.data[1] = '\0';}return resultBigInt; } // if param1 > param2 ,return 1; // if param1 < param2 ,return -1; // if param1 = param2 ,return 0; int compare(const char param1[],const char param2[] ) {int length1 = strlen(param1);int length2 = strlen(param2);if( length1 > length2 ){return 1;}if( length1 < length2 ){return -1;}for( int i=0; i<= length1; ++i){if(param1[i]>param2[i]){return 1;}else if(param1[i]<param2[i]){return -1;}}return 0; }char* addCharArray( const char param1[], const char param2[]) {int length1 = strlen(param1);int length2 = strlen(param2);//one is nullif(length1 == 0){return const_cast<char*>(param2);}else if(length2 == 0){return const_cast<char*>(param2);}//maxlengthint maxLength = max(length1,length2);// extra 2 bits, one is for '\0', one is for carry char* result = new char[maxLength+2];result[maxLength+1] = '\0';int nTakeOver = 0; // carry flagfor(int i = maxLength,j=length1-1,k=length2-1; i>=0; --i,--j,--k){if( j < 0 && k < 0) // in this sitation once at most{result[i] = nTakeOver + '0';break;}int nSum = 0;if(j >= 0 && k < 0) // only paramter1.data has left bits{nSum = param1[j] + nTakeOver;}else if(j < 0 && k >= 0) // only paramter2.data has left bits{nSum = param2[k] + nTakeOver;}else {nSum = param1[j]-'0'+param2[k]-'0'+nTakeOver;}if(nSum >= 10){nTakeOver = 1;nSum -= 10;result[i] = nSum + '0';}else{nTakeOver = 0;result[i] = nSum + '0';}}if( nTakeOver == 1){ // if have a carry ,the MSB is 1return result;}else // the MSB is 0, decrease the length.{char* finalResult = new char[maxLength+1];strcpy(finalResult,result+1);delete[] result;return finalResult;} }//param1 - param2 ,unsigned BigInter // make sure param1 is larger than param2 char* subtractCharArray( const char param1[], const char param2[]) {int length1 = strlen(param1);int length2 = strlen(param2);if(length1 < length2 || compare(param1,param2) < 0){throw new exception("invalid input");}int maxLength = length1;// maxLength at most, one extra bit is saved for '\0'char* result = new char[maxLength+1];result[maxLength] = '\0';// carry flagint nTakeOver = 0;for(int i = maxLength-1,j=length1-1,k=length2-1; i>=0; --i,--j,--k){int nSum = 0;if(j >= 0 && k < 0) // only param1.data has left bits { nSum = param1[j] - '0'- nTakeOver;}else {nSum = param1[j]- param2[k]- nTakeOver;}if(nSum < 0){nTakeOver = 1;nSum += 10;result[i] = nSum + '0';}else{nTakeOver = 0;result[i] = nSum + '0';}}//count the number of zeros at the beginning of the arrayint index = 0;while(result[index]=='0'){++index;}//if no zeroif( index == 0){return result;}//remove zeros at the beginning of the arrayint finalLength = maxLength+1-index;char* finalResult = new char[finalLength];strcpy(finalResult,result+index);delete[] result;return finalResult; }int main() {//one is zero or nullchar* data0 = "0";BigInt bigData0 = BigInt(false,data0);char* data1 = "933900000000000000000000000009";BigInt bigData1 = BigInt(false,data1);BigInt addResultBigInt0 = addBigInt(bigData0,bigData1);//positive testBigInt bigData2 = BigInt(false,data1);BigInt addResultBigInt1 = addBigInt(bigData1,bigData2);// one positive ,one negative test// equalBigInt bigData3 = BigInt(true,data1);BigInt addResultBigInt2 = addBigInt(bigData1,bigData3);// one positive ,one negative testchar* data2 = "933900000000000000000000000008";BigInt bigData4 = BigInt(true,data2);BigInt addResultBigInt3 = addBigInt(bigData4,bigData1);system("pause");}
總結
以上是生活随笔為你收集整理的面试题整理3 大数的表示及加减法问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《深度探索C++对象模型》--7 站在对
- 下一篇: 面试题整理 4 合并两个排序的数组