c++ 字符数字转化问题!!
急急急啊。。。把两个整数字符串相加,每位字符按地位到高位相加的时,结果大于‘9’时怎么办啊啊。比如s1="12387462378319874394749" ,s2="378461897647384963",按位相加的时候,比如s1[10]+s2[10],我想把结果保存到s1,两个字符相加的结果是什么?大于9又怎么办?谢谢各位大神们了!!
[解决办法]
两个大整数字符串相加,从两个字符串的最高位开始相加,先将它们的最高位字符转化为整数进行相加,用一个临时变量保存相加结果的进位,
比如:s1="12387462378319874394749" ,s2="378461897647384963";s1的最高位是9,s2的最高位是3,将它们相加。
- C/C++ code
s1[]="12387462378319874394749",s2[]="378461897647384963";int len1 = strlen(s1),len2 = strlen(s2);int carry = 0,temp;char ch;temp = (s1[len1 - 1] - '0') + (s2[len2 - 1] - '0') + carry;//将两个字符变成整数,然后相加,carry是进位,其初值是0ch = temp % 10 + '0';//相加后的结果对10求余,再加0字符就变成相应的数字字符了carry = temp / 10;//carry保存相加结果后的进位,如果没进位就是0s1[len1 - 1] = ch;//将结果存到s1中,再进行倒数第二位字符的相加,一直循环下去,直到第0个字符,就是2个大整数字符串相加了
[解决办法]
下面是两个大整数字符串相加的代码,不过结果没有保存到s1中,而是另外开辟了一段空间,如果想保存到S1中,就必须确保s1有足够大的空间,再将结果复制到s1中。
- C/C++ code
#include <iostream>using std::endl;using std::cout;using std::cin;int main(){const int size = 50; char s1[size],s2[size]; cout << "please input first s1:"; cin >> s1; cout << "please input second s2:"; cin >> s2; int rsize = (strlen(s1) >= strlen(s2) ?strlen(s1):strlen(s2)) + 2; char *result = new char[rsize]; memset(result,'0',rsize); result[rsize - 1] = '\0'; int k = 0,temp = 0,i,j,m = rsize -2; for(i = strlen(s1) - 1,j = strlen(s2) - 1;i >= 0 && j >= 0; --i,--j) { temp = (s1[i] - '0') + (s2[j] - '0') + k; result[m--] = temp % 10 + '0'; k = temp/10; } if(i < 0 && j >= 0) { while(j >= 0) { temp = s2[j--] - '0' + k; result[m--] = temp % 10 + '0'; k = temp/10; } } else if(i >=0 && j < 0) { while(i >= 0) { temp = s1[i--] - '0' + k; result[m--] = temp % 10 + '0'; k = temp / 10; } } result[m] = k + '0'; cout << " sum:"; if(result[0] == '0') cout << result + 1 << endl; else cout << result << endl; delete []result;return 0;}