首先是大数相加,大数相加主要是考虑进位的问题,这个问题其实也很好解决,只要相加大于9,就说明要进位,此时当前位置的下一位加1,当前位只保留个位,就可以了,具体看代码。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,n,m,a[110],b[110],max,c[110];
char s[110],ss[110];
while(gets(s),gets(ss))
{
k=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=strlen(s);
m=strlen(ss);
for(i=n-1;i>=0;i--)
a[k++]=s[i]-'0';//逆序存储,以便相加的时候从个位开始相加
k=0;
for(i=m-1;i>=0;i--)
b[k++]=ss[i]-'0';
max=n;
if(m>max)
max=m; //找到两个数中较长的那个
for(i=0;i<max;i++)
{
c[i]=a[i]+b[i]+c[i];
if(c[i]>=10)
{
c[i]=c[i]-10;
c[i+1]++;
}
}
while(c[max-1]==0&&max!=1)//去掉前缀0
max--;
for(i=max-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}
大数相减,跟大数相加比较就是这里考虑的是借位,和判断两个数的大小,以便判断结果是正还是负。
代码中也有解释:
#include<stdio.h>
#include<string.h>
int main()
{
char s1[20000],s2[20000],t;
int a[20000],b[20000],c[20000],len1,len2,max,i,flag;
while(scanf("%s%s",s1,s2)!=EOF)
{
flag=0;
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
len1=strlen(s1);
len2=strlen(s2);
max=len1;
if(len2>max)
max=len2;
t=0;
for(i=len1-1;i>=0;i--)
a[t++]=s1[i]-'0';
t=0;
for(i=len2-1;i>=0;i--)
b[t++]=s2[i]-'0';
if(len1<len2)//flag==1都表示第一个数比 第二个数小
flag=1;
if(len1==len2)
if(strcmp(s1,s2)<0)//长度相等,直接判断两个数的大小
flag=1;
for(i=0;i<max;i++)
{
if(flag==0)
{
if(a[i]<b[i])
{
a[i+1]--;//借位
a[i]+=10;//借位之后本位加10
}
c[i]=a[i]-b[i];//计算差值并存入数组
}
else if(flag==1)
{
if(b[i]<a[i])
{
b[i+1]--;
b[i]+=10;
}
c[i]=b[i]-a[i];
}
}
while(c[max-1]==0&&max!=1)//去除前导0
max--;
if(flag==1)//如果第一个数比第二个数小,则计算出来的结果为负值
printf("-");
for(i=max-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}
大数乘法运算,跟两个数相乘是一样的,就是用一个双重循环让一个数的某一位乘以另一个数的所有位,和乘法的计算一样,这里任然要考虑要进位的问题,但是并不是在乘的时候进位,而是现将乘的结果先存到数组里,最后用一个循环去判断数组的每一个然后,该进位的进位就可以了。
代码如下
#include<stdio.h>
#include<string.h>
int main()
{
int a[20000],b[20000],c[20000],d[20000],len1,len2,t,i,j;
char s1[20000],s2[20000];
while(scanf("%s%s",s1,s2)!=EOF)
{
t=0;
memset(c,0,sizeof(c));
len1=strlen(s1);
len2=strlen(s2);
for(i=len1-1;i>=0;i--)
a[t++]=s1[i]-'0';
t=0;
for(i=len2-1;i>=0;i--)
b[t++]=s2[i]-'0';
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
c[i+j]+=a[i]*b[j];//现将结果保存下来
t=j=0;
for(i=0;i<=len1+len2-1;i++)//对每一个进行判断进位
{
d[j++]=(c[i]+t)%10;
t=(c[i]+t)/10;
}
while(t)//这里就是判断最后两个数相加后是否有进位
{
d[j++]=t%10;
t/=10;
}
while(d[j-1]==0&&j!=1)//去除前导零
j--;
for(i=j-1;i>=0;i--)
printf("%d",d[i]);
printf("\n");
}
return 0;
}
大数相除我在网上也查了,但是写的都太麻烦,没看太懂。所以就暂时先不分享了,捂脸。