1.为什么使用高精度算法啊?
在c语言中,int类型取值范围为(-2^31 ~ 2^31-1),而long long类型取值范围也才仅有(-2^63~ 2^63-1),在处理一些较大的数据时,显然仅靠这些类型,是完全无法处理的
2.高精度加法的核心思想(图解)
3.高精度算法的核心思想
其实就是用数组来处理高精度问题
将很大的数字用字符数组存储,再将其中一个个的数字变为整数存入整形数组中
4.准备工作
1.要输入东西
int main()
{
char s1[3000], s2[3000];
scanf("%s%s", s1, s2);
int a[3000], b[3000], c[3000];//a来装s1,b来装s2,c来求和
memset(a, 0, sizeof(a));//将数组清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
return 0;
}
2.开始转化数字
int l1 = strlen(s1);
int l2 = strlen(s2);
int i, j;
for (i = 0, j = l1 - 1; i < l1; i++, j--)
{
a[i] = s1[j] - '0';
}
for (i = 0, j = l2 - 1; i < l2; i++, j--)
{
b[i] = s2[j] - '0';
}
//注意这里我们要逆着放入输入的数,原因是便于我们后续处理,个人认为没啥特别的,也不需要特别理解
5.核心代码
开始转化了哦!!!
int len = 0;
if (l1 > l2)
{
len = l1;
}
else
{
len = l2;
}
for (i = 0; i < len; i++)
{
c[i] = a[i] + b[i];
}
for (i = 0; i < len; i++)
{
if (c[i] >= 10)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
//就是我上面那张图解,实际上可以做的更好,但为了便于理解我将这块分成了两部分
6.最后工作
i = 2999;
while (c[i] == 0 && i > 0)//去零,就low点把实际上还有好的办法,但理解第一
{
i--;
}
for (j = i; j >= 0; j--)//逆着输出这不就对上了吗
{
printf("%d", c[j]);
}
7.最终代码
#include <stdio.h>
#include <string.h>
int main()
{
char s1[3000], s2[3000];
scanf("%s%s", s1, s2);
int a[3000], b[3000], c[3000];
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
int l1 = strlen(s1);
int l2 = strlen(s2);
int i, j;
for (i = 0, j = l1 - 1; i < l1; i++, j--)
{
a[i] = s1[j] - '0';
}
for (i = 0, j = l2 - 1; i < l2; i++, j--)
{
b[i] = s2[j] - '0';
}
int len = 0;
if (l1 > l2)
{
len = l1;
}
else
{
len = l2;
}
for (i = 0; i < len; i++)
{
c[i] = a[i] + b[i];
}
for (i = 0; i < len; i++)
{
if (c[i] >= 10)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
i = 2999;
while (c[i] == 0 && i > 0)
{
i--;
}
for (j = i; j >= 0; j--)
{
printf("%d", c[j]);
}
return 0;
}
8.结果展示
2341245213543654576547567
2314231535464575675686788
4655476749008230252234355
D:\vs2019 c\算法分析\Debug\main.c.exe (进程 6968)已退出,代码为 0。
按任意键关闭此窗口. . .
总结
算法魅力无穷,本人水平有限,只能至此。愿与诸君共同进步,奔向美好未来