题解 | #Powerful Calculator#
Powerful Calculator
https://www.nowcoder.com/practice/6bc1dd2ee0ce4257821531719b8d1c83
//一个题把大数加法,大数减法,大数乘法全考了给我说这是入门题... #include "stdio.h" #include "string" #include "algorithm" using namespace std; string addString(string num1,string num2){ int length = num1.size()>num2.size()?num1.size():num2.size();//length为最长数字串长度 while (num1.size() < length) num1 = "0" + num1; while (num2.size() < length) num2 = "0" + num2; int carry = 0; string num3 = "";int temp;//num3为最终计算出的字符串,temp为中间变量 for (int i = length-1; i >= 0; --i) { temp = num1[i]-'0'+num2[i]-'0'+carry; if (temp > 9){ carry = 1; num3 += temp-10+'0'; } else{ carry = 0; num3 += temp+'0'; } } if (carry == 1)//最后还有判断是否有进位 num3 += "1"; reverse(num3.begin(),num3.end()); return num3; } /* * 大数减法思路:先判断被减数和减数的长度,若为被减数长则结果为正,否则为负。若而这长度相等, * 则判断哪个数大,不然最后再处理负号会很麻烦。其他的思想就和加法很像了,有个借位的变量,从低位开始 */ string subString(string num1,string num2){//num1为被减数,num2为减数 bool flag;//true为正,false为负 int length1 = num1.size(); int length2 = num2.size(); int length; if(length1 > length2){//存储长数字串长度且被减数永远是大数 flag = true; length = length1; } else if (length1 < length2){ flag = false; length = length2; swap(num1,num2); } else{ int i; for (i = 0; i < length1; ++i) { if (num1[i] > num2[i]){//num1大 flag = true; length = length1; break; } else if (num1[i] < num2[i]){//num2大 flag = false; length = length2; swap(num1,num2); break; } } if (i == length1) return "0"; }//上述为判断减法结果的正负 while (num1.size() < length) num1 = "0" + num1; while (num2.size() < length) num2 = "0" + num2; int borrow = 0;int temp;string num3; for (int i = length-1; i >= 0; --i) { temp = (num1[i]-'0')-(num2[i]-'0')-borrow; if (temp < 0){ borrow = 1; temp += 10; num3 += temp + '0'; } else{ borrow = 0; num3 += temp + '0'; } } int i = num3.size()-1; while (num3[i] == '0')//消除前导0 --i; num3 = num3.substr(0,i+1); reverse(num3.begin(),num3.end()); if(flag) return num3; else return "-"+num3; } string multiString(string num1,string num2){// int num3[810] = {0}; reverse(num1.begin(),num1.end()); reverse(num2.begin(),num2.end());//为了方便先颠倒过来 int length1 = num1.size(); int length2 = num2.size(); int temp; for (int i = 0; i < length1; ++i) {//num3低字节存储地位,所以num3记得颠倒 for (int j = 0; j < length2; ++j) { temp = (num1[i]-'0')*(num2[j]-'0'); num3[i+j] += temp; } } for (int i = 0; i < 810; ++i) { if (num3[i] > 9){ temp = (num3[i] - num3[i]%10)/10; num3[i] = num3[i]%10; num3[i+1] += temp; } } int i = 809; while (num3[i] == 0) --i;//消除前导0,i+1为长度 string str = ""; for (int j = 0; j < i+1; ++j) { str += num3[j]+'0'; } reverse(str.begin(),str.end()); return str; } int main(){ char buf1[410],buf2[410]; string str1,str2; while (scanf("%s",buf1)!=EOF){ scanf("%s",buf2); str1 = buf1;str2 = buf2; printf("%s\n", addString(str1,str2).c_str()); printf("%s\n", subString(str1,str2).c_str()); printf("%s\n", multiString(str1,str2).c_str()); } }