为什么要用高精度算法?

int的范围是-2的31次方到2的31次方-1,数量级为10的9次方

long long的范围是-2的63次方到2的63次方-1,数量级为10的18次方

如果超出该数量级,就要用高精度算法

我们可以用数组来进行高精度运算

以我们以前学过的加法竖式为例,a[i]和b[i]相加,得到c[i],如果相加结果>=10,需要向前一位(c[i+1])进一

高精度加法的算法核心是:

c[i]+=a[i]+b[i]  这一位的结果=这一位a+b的结果+上一位>=10部分的进位

c[i+1]=c[i]/10  上一位>=10要向下一位进位

c[i]=c[i]%10  每一位>=10时只取个位

 

如果要实现1234和827的相加,可以把1234和827存入数组,为了在竖式中让两个数的末位对齐,我们要将两个数倒过来存储。

具体代码如下图所示

#include<stdio.h>
#include<string.h>//使用strlen测量长度
int main() {
	//输入想要相加的两个数
	char A[505];
	char B[505];
	scanf("%s",A);
	scanf("%s",B);
	//测量两个数的长度
	int len_a = strlen(A);
	int len_b = strlen(B);
	//将两个数倒过来存储,确保末位对其
	//三个数组必须初始化,否则结果错误!!!
	int a[505] = { 0 };
	int b[505] = { 0 };
	int c[505] = { 0 };//存入相加的答案
	for (int i = 0; i < len_a;i++) {
		a[len_a - i] = A[i] - '0';
	}
	for (int i = 0; i < len_b; i++) {
		b[len_b - i] = B[i] - '0';
	}
	//求出长度较大值,+1表示进一位
	//比如33+999,长度较大值是3,最终结果是四位数
	int len_c = (len_a > len_b ? len_a : len_b) + 1;
	//在数组中实现两数相加
	for (int i = 0; i < len_c;i++) {
		//这一位的结果=这一位a+b的结果+上一位>=10部分的进位
		c[i] += a[i] + b[i];
		//上一位>=10要向下一位进位
		c[i + 1] = c[i] / 10;
		//每一位>=10时只取个位
		c[i] = c[i] % 10;
	}
	//如果没有进位则需删去最前面的0(由于结果倒序此时0在最后面)
	//这里不需要加上len_c>0的判断!!!感谢大佬的指正!
    //因为输入0+0后len_c最小为2,在下面if语句中自减为1,仍然可以在for语句中打印出c[1]
	if (c[len_c] == 0 ) {
		len_c--;
	}
	//将相加结果倒序打印出来
	for (int i = len_c; i > 0;i--) {
		printf("%d", c[i]);
	}
	return 0;
}

测试结果:

测试结果与计算器结果一致

经测试0+0==0也能运行

如有问题可以在评论区留言交流哦

 

更多推荐