前言
发现博客可以用来记录自己的学习过程,真不错。
第一次遇到需要高精度计算的题目,一开始傻乎乎的直接计算发现不得行,原来还能这样。
主要思路:
字符数组可以连续输入但又不是整型数字而是字符,而整型数组可以输入数字但又不能连续输入,所以两者结合一下就可以解决。
代码如下:
1.先将大数字通过字符数组存入。
#include <stdio.h>
int main()
{
char num1[200]={0},num2[200]={0};
int a[200]={0},b[200]={0},num[200]={0},j=0,k=0,l1=0,l2=0,l,i=0,m,n;
scanf("%s",num1); //num1和num2用来存大型数组
scanf("%s",num2);
2.计算出字符串长度方便后面使用
while(num1[l1]!='\0') l1++;
while(num2[l2]!='\0') l2++; //计算长度
if(l1>l2) l=l1;
else l=l2; //找出哪个数字更大,方便后面及时停止循环
for(m=0,j=199;l1!=m;j--,m++)
a[j]=num1[l1-m-1]-'0'; //将字符数组中的数字赋值到数字数组中
for(n=0,k=199;l2!=n;k--,n++) //a,b为存储大型数字的整型数组
b[k]=num2[l2-n-1]-'0'; //从数组的最后一位开始复制到整型数组的最后一位
3.重点就是计算,加法的计算还是简单点的,主要方法是个位为两个数各位相加再求余,然后/10进位到百位,依次类推。
int t = 0;
for(;i<l+1;i++) //l+1为更大的数长度加一,因为最大也只是往前加个一
{
num[199-i]=(a[199-i]+b[199-i]+t)%10; //t为小位进位过来的数
t=(a[199-i]+b[199-i]+t)/10
}
4.计算已经做好,只需要再把数组前面的0全部去除输出就行
i=0;
for(;i<200;i++)
{
if(num[i]!=0)
break; //从左往右依次输出,遇到0跳过,第一次遇到非0跳出循环
}
for(;i<200;i++)
printf("%d",num[i]);
完整代码
#include <stdio.h>
int main()
{
char num1[200]={0},num2[200]={0};
int a[200]={0},b[200]={0},num[200]={0},j=0,k=0,l1=0,l2=0,l,i=0,m,n;
scanf("%s",num1);
scanf("%s",num2);
while(num1[l1]!='\0') l1++;
while(num2[l2]!='\0') l2++;
if(l1>l2) l=l1;
else l=l2;
for(m=0,j=199;l1!=m;j--,m++)
a[j]=num1[l1-m-1]-'0';
for(k=199,n=0;l2!=n;k--,n++)
b[k]=num2[l2-n-1]-'0';
int t = 0;
for(;i<l+1;i++)
{
num[199-i]=(a[199-i]+b[199-i]+t)%10;
t=(a[199-i]+b[199-i]+t)/10;
}
i=0;
for(;i<200;i++)
{
if(num[i]!=0)
break;
}
for(;i<200;i++)
printf("%d",num[i]);
}
总结
发现小位进位只能进1,好像还能更简单点,以后优化一下,高精度乘法好像更难点。