<p>1.大数加法</p>
# include <stdio.h>
# include <string.h>
void zhuanghuan (char r[],int n,int d[])//首先将字符数组转化为整型,并将他们的长度补齐。
{
int j=204,i;
for(i=n-1;i>=0;i--)
{
d[j--]=r[i]-'0';
}
}
int qingchu (int a[])//将前面多余的前导0去掉
{
int q=0,i;
for(i=0;i<204;i++)
{
if(a[i]==0)
{
q++;
}
if(a[i]!=0)
break;
}
return q;
}
int main()
{
char a[205],b[205];
int d[205]={0},e[205]={205},c[205]={0},w1,w2,m,i,j,k=0;
gets(a);
gets(b);
w1=strlen(a);
w2=strlen(b);
zhuanghuan(a,w1,d);
zhuanghuan(b,w2,e);
for(i=204;i>0;i--)//进行累加,大数加法的核心算法。用一个k来表示进位。
{
c[i]=d[i]+e[i]+k;
k=c[i]/10;
c[i]=c[i]%10;
}
m=qingchu(c);
for(i=m;i<205;i++)
printf("%d",c[i]);
return 0;
}
2.大数减法
# include <stdio.h>
# include <string.h>
void zhuanghuan (char r[],int n,int d[])//首先将字符数组转化为整型,并将他们的长度补齐。
{
int j=204,i;
for(i=n-1;i>=0;i--)
{
d[j--]=r[i]-'0';
}
}
int qingchu (int a[])//将前面多余的前导0去掉。
{
int q=0,i;
for(i=0;i<204;i++)
{
if(a[i]==0)
{
q++;
}
if(a[i]!=0)
break;
}
return q;
}
int main()
{
char a[205],b[205];
int d[205]={0},e[205]={205},c[205]={0},w1,w2,m,i,j,k=0;
gets(a);
gets(b);
w1=strlen(a);
w2=strlen(b);
zhuanghuan(a,w1,d);
zhuanghuan(b,w2,e);
for(i=204;i>0;i--)//大数减法的核心算法,用一个k来表示对上一位进行减一操作。
{
if(d[i]-e[i]-k>=0)
{
c[i]=d[i]-e[i]-k;
k=0;
}
else
{
c[i]=d[i]+10-e[i]-k;
k=1;
}
}
m=qingchu(c);
for(i=m;i<205;i++)
printf("%d",c[i]);
return 0;
}
3.大数乘法
# include <stdio.h>
# include <string.h>
void zhuanghuan (char r[],int n,int d[])//首先将字符数组转化为整型,并将他们的长度补齐。
{
int j=204,i;
for(i=n-1;i>=0;i--)
{
d[j--]=r[i]-'0';
}
}
int qingchu (int a[])//将前面多余的前导0去掉
{
int q=0,i;
for(i=0;i<499;i++)
{
if(a[i]==0)
{
q++;
}
if(a[i]!=0)
break;
}
return q;
}
void chengfa (int d[],int e[])//大数乘法核心算法
{
int c[500]={0},p[500]={0},p2[500]={0},w1,w2,i,j,m,r=0,q=0,k=0,f;
for(i=204;i>=0;i--)
{
m=r;
for(j=204;j>=0;j--)//首先对每一位进行乘法
{
c[m]=d[j]*e[i]+k;
k=c[m]/10;
c[m]=c[m]%10;
m++;
}
k=0;
for(f=q;f<500;f++)//让后利用q来达到向前一位相加的效果。
{
p[f]=p[f]+c[f]+k;//对上一位进行累加
k=p[f]/10;
p[f]=p[f]%10;
}
k=0;
r++;
q++;
}
j=0;
for(i=499;i>=0;i--)
{
p2[j++]=p[i];
}
f=qingchu(p2);
for(i=f;i<500;i++)
{
printf("%d",p2[i]);
}
}
int main()
{
char a[205]={0},b[205]={0};
int d[205]={0},e[205]={0},w1,w2;
gets(a);
gets(b);
w1=strlen(a);
w2=strlen(b);
zhuanghuan(a,w1,d);
zhuanghuan(b,w2,e);
chengfa(d,e);
return 0;
}
4.大数除法(求出商和余)
# include <stdio.h>
# include <string.h>//首先该算法的基本思路为将除数扩大倍数与被除数相等,然后与被除数反复相减
// 直到相减得到的数小于当前倍数的除数,将除数缩小一位倍数,在进行相减,
//每次相减做一次判断,直到扩大的倍数为一倍时,结束循环。
// 将当前倍数与当前累加的次数进行累加 得到的数即为商。
//根据思路,此程序还可求出余数
void zhuanghuan (char r[],int n,int d[])//首先将字符数组转化为整型,并将他们的长度补齐。
{
int j=104,i;
for(i=n-1;i>=0;i--)
{
d[j--]=r[i]-'0';
}
}
int compare(int a[],int b[])//将减去的数与当前倍数的除数进行比较
{
int c[105]={0},i,k=0;
for(i=104;i>0;i--)
{
if(a[i]-b[i]-k>=0)
{
c[i]=a[i]-b[i]-k;
k=0;
}
else
{
c[i]=a[i]+10-b[i]-k;
k=1;
}
}
if(c[1]==0)
return 1;
else
return -1;
}
void reduce (int a[],int r,int m,int d[])//将除数扩大倍数
{
int j,i;
j=104-r;
for(i=104;i>=105-m;i--)
d[j--]=a[i];
}
int qingchu(int a[])//消除多余的前导0
{
int i,n=0;
for(i=1;i<104;i++)
{
if(a[i]==0)
n++;
if(a[i]!=0)
break;
}
return n;
}
int main()
{
char a[105],b[105];
int d[105]={0},e[105]={0},m[105]={0},c[105]={0},add[105]={0},kz[105]={0},k=0,r,x=0,r1,i,w1,w2,num,num1;
gets(a);
gets(b);
w1=strlen(a);
w2=strlen(b);
zhuanghuan(a,w1,d);
zhuanghuan(b,w2,e);
r=w1-w2;
r1=104-r;
kz[r1]=1;
if(w1<w2)
{ printf("add[0]\n");
for(i=105-w1;i<105;i++)
printf("%d",d[i]);
}
else
{
while(r1<=104)
{
reduce(e,r,w2,m);//扩大到与被除数相同的倍数
if(compare(d,m)>0)//进行比较,如果成立 进行
{
for(i=104;i>0;i--)
{
if(d[i]-m[i]-k>=0)
{
c[i]=d[i]-m[i]-k;
k=0;
}
else
{
c[i]=d[i]+10-m[i]-k;
k=1;
}
}
k=0;
for(i=0;i<105;i++)
{
d[i]=c[i];
}
for(i=0;i<105;i++)//累加
{
add[i]=add[i]+kz[i]+x;
x=add[i]/10;
add[i]=add[i]%10;
}
x=0;
}
else
{
for(i=0;i<105;i++)//改变倍数
{
m[i]=0;
}
for(i=0;i<105;i++)
{
kz[i]=0;
}
r1++;
kz[r1]=1;
r--;
}
}
num=qingchu(add)+1;
for(i=num;i<105;i++)
{
printf("%d",add[i]);
}
printf("\n");
num1=qingchu(d)+1;
for(i=num1;i<105;i++)
{
printf("%d",d[i]);
}
return 0;
}
}
通过编写我明白了函数分模块编写的重要性,也更加明白了一句话,程序是靠体力熬出来的,没有一天又一天的思考,自然就没有编出来的那一刻的喜悦。有时候你的思路是对的可有时侯一些自加自减的位置不对往往就会导致程序与你想要表达相差甚远。程序在编写过程当不顺心总会令人感到烦躁想要放弃,但你也要明白高手就是在你想要放弃时他却在咬牙坚持。加油!