Loading... ## 高精度: 通俗来说就是超过了C语言整形运算范围而采用的一种算法。 我们首先来了解一下: <div class="tip inlineBlock warning"> 我们怎么才能使数据不溢出,来进行数据运算呢? </div> <div class="tip inlineBlock success"> 答:是不是任何两位数相加数据都不会溢出。 </div> <div class="tip inlineBlock warning"> 我们应该怎么存储一连串的数字呢? </div> <div class="tip inlineBlock success"> 答:字符型数组。 </div> ## 思路: 那么我们是不是可以这样把每一个字符转换成为整形,然后运算时就是整形与整形的加法了, 然后我们再把计算的结果赋值给数组,利用数组循环打印输出相加后的结果即可。 ## 细节: 如何位与位对齐相加: 我们把第一个字符数组反向,每一个字符转换整形遍历赋值给第一个整形数组, 把第二个字符数组反向,每一个字符转换整形遍历赋值给第二个整形数组, <div class="tip inlineBlock warning"> 为什么要把字符数组进行反向赋值? </div> <div class="tip inlineBlock success"> 因为我们并不知道哪一个数组最高位 最高,这时候就可能会出现第一个数组的第一个元素与第二个数组的第一个元素最高位不同,位与位不同我们自然不能进行相加;但是我们可以反着来,无论如何是不是最后一个元素都是个位,接着十位,接着百位,依次类推 </div> 我们首先提取第一个整形数组与第二个整形数组的第一个元素进行相加,会发现这就是个位数进行相加,对于相加我们得考虑进位的问题,我们可以先用 `相加数 %10`这个来获得个位数,我们把这个,个位数赋值给第三个整形数组的第一个元素;然后 对于十位数, 我们也是提取第一个整形数组与第二个整形数组的第二个元素进行相加,但是这个时候如果有进位的话我们需要加上进位的数,也就是加上`相加数 / 10`(这里的相加数是:前一次相加的两个数)然后我们把这个,十位数赋值给第三个整形数组的第二个元素;就这样循环反复我们就可以达到对齐相加,而且进位的目的。 ## 代码: ```cpp #include<stdio.h> #include<string.h> #define MAX 100 //预定义MAX 为100 int main() { int str1[MAX] = {0}, str2[MAX] = {0}, str3[MAX] = {0}; char str[MAX]; int str1_num, str2_num, i, n, j, k = 0; scanf("%s", str); str1_num = strlen(str); for(i = 0; i < str1_num; i++) //让第一个字符数组给第一个整形数组反向赋值 { str1[i] = str[str1_num - 1 - i] - '0'; } scanf("%s", str); str2_num = strlen(str); for(i = 0; i < str2_num; i++)//让第二个字符数组给第二个整形数组反向赋值 { str2[i] = str[str2_num - 1 - i] - '0'; } n = str1_num > str2_num ? str1_num:str2_num; //比较两个字符数组的大小,实际上是选择最高位 for(i = 0; i < n; i++) { j = str1[i] + str2[i] + k;//位于位对齐相加并且加上进位 str3[i] = j % 10;//取余赋值 k = j / 10;//进位提取数值 } if(k > 0) str3[i++] = k;//如果最后的进位大于0,但是我们最高位已经无法再加了,这时我们需要扩大最高位,然后把进位赋值给最高位 for (i = 0; i < n; i++)//反向遍历输出相加结果 { printf("%d", str3[n - 1 - i]); } return 0; } ``` ## c++版本: ```cpp #include<bits/stdc++.h> using namespace std; string s1, s2; vector<int>a, b; vector<int> add_num(vector<int>&a, vector<int>&b){ if(a.size() < b.size())return add_num(b, a); int k = 0; vector<int>c; for(int i = 0; i < a.size(); i++){ k += a[i]; if(i < b.size())k += b[i]; c.push_back(k%10); k /= 10; } if(k > 0)c.push_back(k); return c; } int main(){ cin >> s1 >> s2; for(int i = s1.size()-1; i >= 0; i--)a.push_back(s1[i] - '0'); for(int i = s2.size()-1; i >= 0; i--)b.push_back(s2[i] - '0'); vector<int>c = add_num(a, b); for(int i = c.size() - 1; i >= 0 ; i--)cout<<c[i]; return 0; } ``` 最后修改:2022 年 03 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。