简单实现大数相加
2014-11-06 23:55 rangers 阅读(304) 评论(0) 编辑 收藏 举报思路:
使用字符串来表示大数,然后对两个数字字符串使用类似列竖式的方式进行逐位相加求和。
123 +
24
_____
147
具体实现:
char* BigNumberAddition(const char* number1, const char* number2) { if (!number1 || !number2) { return NULL; } int len1 = strlen(number1); int len2 = strlen(number2); //两个数相加 结果的位数 为大数的位数 或 大数的位数+1 int result_len = max(len1,len2) + 1; char* result = (char*)malloc(result_len + 1); memset(result,0,result_len + 1); int index = result_len; --index; --len1; --len2; while (len1 >= 0 && len2 >= 0) { //逐位相加 result[index] += (number1[len1] - '0') + (number2[len2] - '0'); if (result[index] >= 10) { //进位 result[index - 1] += result[index] / 10; result[index] = result[index] % 10; } --index; --len1; --len2; } while(len1 >= 0) { result[index] += (number1[len1] - '0'); if (result[index] >= 10) { //进位 result[index - 1] += result[index] / 10; result[index] = result[index] % 10; } --len1; --index; } while(len2 >= 0) { result[index] += (number2[len2] - '0'); if (result[index] >= 10) { //进位 result[index - 1] += result[index] / 10; result[index] = result[index] % 10; } --len2; --index; } //去掉首位的0 int gap = result[0] == 0 ? 1 : 0; for (int i = 0; i < result_len; i++) { result[i] = result[i + gap] + '0'; } result[result_len - gap] = '\0'; return result; }
注意:
1、逐位相加的时候要考虑进位
2、一般两个数相加,如:数1的位数为a, 数2的位数为b,则相加的结果位数可能为 max(a,b) 或 max(a,b) +1. 所以要注意相加结果首位可能是0.
3、用字符串表示数字的时候,是用字符表示数字的 0 --> '0' ,所以在相加计算的时候要将字符转换为对应的数字。
int _tmain(int argc, _TCHAR* argv[])
{
char* number1 = "9999999";
char* number2 = "9999999";
char* result = BigNumberAddition(number1,number2);
cout << result;
free(result);
return 0;
}
运行结果: