所谓高精度,就是算一下计算机无法帮我们计算的数,可能是因为位数太多,所以我们要帮助计算机来计算数字的运算的一个算法
我先写一篇高精度的加法,这些是基于竖式计算换成算法。
一,数字的储存
我们不可能像最基础内样,直接int a=418949615648975449614185;
这样数字位数会太大,int装不下(也不要想long long,数字位数多了都不行),那么如何来将想要计算的数字储存进计算机中呢
我们会想到数组,把每一位数字分别装到数组里,但是直接用整型数组的话,我们必须像这样输入
1 5 3 4 8 7 5(这是1534875),
肯定不可以这样输入,那就需要用到字符数组了,里面装的是字符,我们到时候只需要完成字符与整型的转化就行了。
下面是一个数字的转换,计算肯定是两个数字之间的,同时写两遍就行
#include<stdio.h>
#include<string.h>
int main (void)
{
//最多可以储存1200位数字
char num1[1200]={0};
//装转换后的数字
int a[1200]={0};
//这里num1是数组,所以不用写&
scanf("%s",num1);
//因为我们具体不知道有多少位数字,用一个strlen函数,算一下,确认一下循环次数,来导入int a[1200]数组中
int str1=strlen(num1);
for(i=0;i<str1;i++)
{
//这里数字倒着放,对后面计算会有便利,记住咱们是从a[1]开始储存的
a[str1-i]=num1[i]-'0';
}
两个数字就导入完毕了,是不是需要再来一个数组来装结果,这个和有可能进1(5000+4000),有可能没有进1(5000+1)
所以结果的位数最大为大数的位数加1
让我们写一个函数,求出最大值后+1
//这里的x,y装的是num1,和num2的长度
int max(int x,int y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}
int str3=max(str1,str2)+1;这个就可以求出结果所需的最大长度(等会会有个对于有没有进一的处理)
至此,两个数字的储存,和结果所需的储存都已到位。
这是第一阶段全部的代码
#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}
int main (void)
{
//一定要对数组赋初值,我有几次没赋初值莫名其妙的错了(不是这道题),不太懂这里
char num1[1200]={0};
char num2[1200]={0};
int a[1200]={0};
int b[1200]={0};
int c[1200]={0};
scanf("%s",num1);
scanf("%s",num2);
int str1=strlen(a);
int str2=strlen(b);
for(i=0;i<str1;i++)
{
a[str1-i]=num1[i]-'0';
}
for(i=0;i<str2;i++)
{
b[str2-i]=num2[i]-'0';
}
int str3=max(str1,str2)+1;
二,核心代码:加法时对于两个数字的处理
直接将运算值写入结果的数组中,直接开写吧,在代码中解释
//再次说一下,这个是倒着录进去的,也就是说是从低位到高位的计算,很合理,而且1是第一位
for(i=1;i<=str3;i++)
{
//为什么要+=呢?因为会出现进位的情况
//第一个先把同一位的和求出来,加上上一位如果进位过来的值
c[i]+=(a[i]+b[i]);
//将满10进1的进到下一位
c[i+1]+=c[i]/10;
//得到本位的值
c[i]%=10;
}
有不懂的,可以拿张纸捋一下。
三,判断有无进一
如果没有进一的话,最高位就为0
用一个if来判断一下
if(c[str3]==0&&str3>1)
{
str3--;
}
讲一下这个,就是此时str3判断它是否为0,如果不为0,就保留,如果等于0,就不保留,这个str3>0这个条件,
是因为如果str3等于0的话,那就一定为0了,防止这种情况的发生
四,输出
因为我们是倒着装的嘛,所以倒着输出
for(i=str3;i>0;i--)
{
printf("%d",c[i]);
}
完整代码
#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}
int main (void)
{
int i;
char num1[1000];
char num2[1000];
scanf("%s",&num1);
scanf("%s",&num2);
int a[2000]={0};
int b[2000]={0};
int c[2000]={0};
int str1=strlen(num1);
int str2=strlen(num2);
int str3=max(str1,str2)+1;
for(i=0;i<str1;i++)
{
a[str1-i]=num1[i]-'0';
}
for(i=0;i<str2;i++)
{
b[str2-i]=num2[i]-'0';
}
for(i=1;i<=str3;i++)
{
c[i]+=(a[i]+b[i]);
c[i+1]+=c[i]/10;
c[i]%=10;
}
if(c[str3]==0&&str3>1)
{
str3--;
}
for(i=str3;i>0;i--)
{
printf("%d",c[i]);
}
return 0;
}