在C语言所给的数据类型中,long long类型数据最大数值为9223372036854775807,当我们要运算的数远远超过了它的范围时,就不能用基本数据类型来表示。为了解决这一问题,我们要进行高精度(大数)运算。
解决思路:我们可以将要进行运算的数存储在字符数组里,模拟手算的方式将运算结果存储在整型数组里。
#include#include int main() { char a[100], b[100];//定义两个字符数组,将输入的数据存储在字符数组里 int c[110];//定义一个整形数组,用于存放运算的结果,从低位向高位存放 memset(c, 0, sizeof(c)); scanf("%s %s", &a, &b); int m = strlen(a), n = strlen(b), max, i, j, ans,p,q;//求出字符串a,b的长度(位数) ans = 0;//ans用来存储进位数字 for (m -= 1, n -= 1, j = 0; m >= 0 && n >= 0; m--, n--, j++) //由于并不知道两个数字位数是否相同,又为了保证对应位相加,所以当有一个数所有位已经运算完成时,跳出循环 { p = a[m]-'0'; q = b[n]-'0';//用p,q做中间变量为了方便调试 ans = p + q + ans; c[j] = ans % 10; ans = ans / 10; if (m == 0 || n == 0) break; } j++;//跳出循环时存放结果数组并没有进位(上次循环时已经占用了j位置),所以j要加一 if (m == 0 && n != 0)//当a的位数小于b的位数时 { n--;//上从循环结束时n位已经参与了运算,要进行下一位的运算,所以n要减一 for (; n >= 0; n--, j++) { //这里不能直接将q赋值给c[j](上一位和这一位的运算可能有进位) q = b[n] - 48; ans = q + ans; c[j] = ans % 10; ans = ans / 10; } } if (m != 0&&n==0)//当b的位数小于a的位数时 { m--; for (; m >= 0; m--, j++) { p = a[m] - 48; c[j]=p; ans = p + ans; c[j] = ans % 10; ans = ans / 10; } } for (j = j - 1; j >= 0; j--)//从最高位向低位依次进行输出 { printf("%d", c[j]); } return 0; }



