首先我要先声明我用的编译器是VS2022,由于我在csdn上没搜到一篇关于c语言高精度算法的文章,所以我决定写一篇c语言的高精度加法文章讲解,希望刚开始以c语言学习编程的同学能从中学会高精度算法--加法。
当我们处理两个整数数(a,b)相加时,会存在一定的限制,因为无论是int还是longlong类型,都有一定的范围,当我们相加的两个数超出这个范围时,就需要我们的高精度算法了。
所谓的高精度算法其实就是将每个数字看成一个字符,然后存到一个字符数组中去,进而进行运算。我们现在展示代码,并且代码后会有解析,若看不懂,可以评论提问。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int Max(int x, int y)
{
if (x >= y)
return x;
else return y;
}//一个比大小的自定义函数,十分简单
int main() {
int a, b, c;//a,b,c是否进行初始化影响并不大
char arr[600] = {0}, brr[600] = {0};//使数组中的元素先为0,然后储存输入的两个树;
int numa[600] = { 0 }, numb[600] = { 0 }, numc[600] = { 0 };//这是关键一步,此时使这三个数组中的元素都为0,可以为后面若两个数组的元素位数不同的话,那就可以自动补0;
scanf_s("%s", arr,600);
scanf_s("%s", brr,600);//取输入的两个数,注意字符要用%s,且不用加&,而且还要带上数组元素的个数,如果不带,就会产生访问冲突;
a = strlen(arr);
b = strlen(brr);//这两步均是计算输入的字符串长度,也就是数字的个数;
for (int i = 0;i < a;i++) {
numa[a - i] = arr[i]-'0';
}
for (int i = 0;i < b;i++) {
numb[b - i] = brr[i]-'0';
}//这两步是将输入的那个数组放入一个新的数组中,并进行倒序处理,因为倒序后更方便个位与个位相加等问题;
c = Max(a, b) + 1;//这步是为了得到两个数相加后数组的个数是多少,其中+1是为了更有保障一些;
for (int i = 1;i <= c;i++) {
numc[i] += numa[i] + numb[i];
numc[i + 1] = numc[i] / 10;
numc[i] = numc[i] % 10;
}//将两个数组下标相同的数相加,得到一个新数组下标所对的数,若相加后大于10,则其余数与下一个下标数相加,最终得到两数相加后的一个新数组。
if (numc[c] == 0 && c > 0)//首位不是0保证
c--;
for (int i = c;i >0;i--) {
printf("%d", numc[i]);
}//逆着打印新数组的各项元素,最终得到两数的和。
return 0;
}
如果其中倒序不理解原因的话,你可以正序试试能不能出来,也可以那草稿纸写一下,更方便理解。期待点赞!!!