1.大数的加法
核心:把大数考虑变成以每一位来看的数组。使用char型数组将数字以字符串的形式存入,然后通过每个-48(-‘0’)进行强制转化为Int型,用两个新的数组对强制转化的每一次进行记录(注意倒叙记录,因为是按每一位来看的,这样a[0]应该从最后一位开始,然后相加后前一位进一刚好可以e[i+1]++来实现)使用数组e对其每个元素(倒叙的两个数组的每一位)进行求和。如果>10,e[i+1]++;这样实现,最后倒叙输出e[i]即可完成。
代码实现:
#include<stdio.h>
#include<string.h>
main()
{
char a[1000],b[1000];
scanf("%s%s",a,b);
int c[1000]={0},d[1000]={0},e[1000]={0};
int a1=strlen(a);
int a2=strlen(b);
int a3=a1-1;
int a4=a2-1; //将字符串倒序
for(int i=0; i<a1; i++)
{
c[a3]=(a[i]-48);
a3--;
}
for(int i=0; i<a2; i++)
{
d[a4]=(b[i]-48);
a4--;
}
int l;
if(a1>=a2)
l=a1;
else
l=a2;
for(int i=0; i<l; i++)
{
e[i]+=(c[i]+d[i]); //对两组字符串中的数逐位相加,存于e[i]
if(e[i]>=10) // 得到的结果进行进制位处理
{
e[i+1]++;
e[i]=e[i]%10;
}
}
printf("%s + %s = ",a,b);
if(e[l]!=0)
printf("%d",e[l]);
for(int i=l-1; i>=0; i--)
{
printf("%d",e[i]);
}
}
2.大数的乘法
前面的操作一样,转化,倒叙记录。通过两个for保证两个数组中的数每个都与另外一个相乘后i+j相同的相加,保存于数组(e[i+j]+=(c[i]*d[j]);)通过循环把00000561654这样的前面的0删除,后直接输出即可,今天初次接触,后面有可能遗忘,还需多加练习。
代码实现:
#include<stdio.h>
#include<string.h>
main()
{
char a[1000],b[1000];
gets(a);
gets(b);
int c[1000]={0},d[1000]={0},e[1000]={0};
int a1=strlen(a);
int a2=strlen(b);
int a3=a1-1;
int a4=a2-1;
int i,j;
for(i=0;i<a1;i++)
{
c[a3]=(a[i]-48);
a3--;
}
for(i=0;i<a2;i++)
{
d[a4]=(b[i]-48);
a4--;
}
for(i=0;i<a1;i++)
{
for(j=0;j<a2;j++)
{
e[i+j]+=(c[i]*d[j]);
}
}
for( j=0; j<1000 ;j++)
{
if(e[j]>=10)
{
e[j+1]+=e[j]/10;
e[j]%=10;
}
}
//除去多余的0
for(i=999; i>=0; i--)
{
if(e[i]!=0)
break;
}
for(; i>=0; i--)
{
printf("%d",e[i]);
}
}