今天实现了一个小的算法例程,完全模拟笔算的方法,实现大整数的加减乘除。 刚开始,没什么思路,后来用笔算了一遍,其逻辑便一目了然了。 ———————————————————————————————————————————— //************************************************************************* //** 模拟笔算 大数加减乘除 //** 本程序是简单算法示例 假设ab长度固定 且数值固定。 //** 进一步改进:如:增加几个函数,求长度,转变类型,求最大位数等 //** 时间 2011年3月20日 用时 近1h //************************************************************************* #include "stdio.h" /*将长度为m的数组 逆置*/ void reverse(int n[],int m) { int i,temp; for(i=0;i<m/2;i++) { temp=n[i]; n[i]=n[m-1-i]; n[m-1-i]=temp; } } void main() { int i,j,reslt,jw; //循环变量,结果中间值,和借位标志。 bool IsBorrow=false; //在减法中,是否有借位标志。方便添加负号。 bool IsHead=true; //消除运算结果之前的0. int divNum=11; //除数 int a[20]={1,2,3,4,5,6,7,8,9,3}; int b[10]={1,4,5,3,3,2,2,3,5,6}; int c[20]={0}; printf("整数a= "); for(i=0;i<10;i++) printf("%d",a[i]); printf("/n整数b= "); for(i=0;i<10;i++) printf("%d",b[i]); reverse(a,10); //在加减乘中,需要从低位开始运算,所以,将运算数逆置。 reverse(b,10); //加法 for(i=0;i<10;i++) { reslt=a[i]+b[i]+c[i]; jw=reslt/10; //求进位 c[i]=reslt%10; //本位结果 c[i+1]+=jw; } reverse(c,10); printf("/n a+b= "); for(i=0;i<10;i++) { if(IsHead && c[i]==0) continue; IsHead =false; printf("%d",c[i]); } //减法 IsHead=true; for(i=0;i<10;i++) //结果集清零 c[i]=0; for(i=0;i<10;i++) { reslt=a[i]-b[i]+c[i]; //c[i]=0 or -1 if(reslt<0) //有借位 { reslt+=10; c[i+1]--; IsBorrow=true; } c[i]=reslt%10; } reverse(c,10); printf("/n a-b= "); if(IsBorrow) //如果有借位 putchar('-'); for(i=0;i<10;i++) { if(IsHead && c[i]==0) continue; IsHead =false; printf("%d",c[i]); } //乘法 1794225118896715908 IsHead=true; for(i=0;i<20;i++) //结果有二十位 c[i]=0; for(i=0;i<10;i++) //乘数位数 for(j=0;j<10;j++) { reslt=a[j]*b[i]+c[i+j]; jw=reslt/10; c[i+j]=reslt%10; c[i+j+1]+=jw; } reverse(c,20); printf("/n a*b= "); for(i=0;i<20;i++) { if(IsHead && c[i]==0) //如果是开头的0 continue; IsHead =false; printf("%d",c[i]); } //除法 假设最大精度为5 112233444.81818181.. IsHead=true; for(i=0;i<20;i++) c[i]=0; reslt=0; //在这里保存这里遗留下来的位 reverse(a,10); //从高位开始 for(i=10;i<20;i++) a[i]=0; for(i=0;i<20;i++) //被除数位数+精度 { c[i]=(reslt*10+a[i])/divNum; //商 reslt=(reslt*10+a[i]) % divNum; //余数 } printf("/n a/11= "); for(i=0;i<20;i++) { if(i==10) putchar('.'); if(IsHead && c[i]==0) continue; IsHead =false; printf("%d",c[i]); } getchar(); }