大数相乘
2012-12-12 12:15
330 查看
昨晚闲着无聊,试着写下大数相乘,看看初起到时候问题多多,不过整体思路还是对的我想法是用字符数组处理,有两个字符数组,用一个字符数组的每个元素分别和另一个数组的每个元素相乘,把他们的乘积保存在另一个数组中,当然其中也是有点小技巧的,最开始的源码如下:
#include<string.h> #include<stdio.h> int crr[10001]={0}; void main() { int fun(char arr[],char brr[]); int remc(char *a); int jcmwl(int k); int k,a,b,l;//l为零的个数,a,b小数点的位数,k数的位数 char arr[1001],brr[1001]; scanf("%s %s",arr,brr); a=remc(arr); b=remc(brr); printf("The result is:\n"); if(a==-1 || b==-1) printf("Input is incorrect, please enter again!\n"); else{ k=fun(arr,brr); if(a==0 && b==0){ for(k=k-1;k>=0;k--) printf("%d",crr[k]); printf("\n"); } else if(a==0 && b!=0){ l=jcmwl(k); for(k=k-1-l;k>=0;k--){//结果的位数-零的位数=实际的位数 if(k==b-1-l)//判断下点'.'的位置(k=多少说明后面还有多少位数,此时如果等于小数位数,就输出 '.') printf("."); printf("%d",crr[k]); } printf("\n"); } else if(b==0 && a!=0){ l=jcmwl(k); for(k=k-1-l;k>=0;k--){ if(k==a-1-l) printf("."); printf("%d",crr[k]); } printf("\n"); } else{ l=jcmwl(k); for(k=k-1-l;k>=0;k--){ if(k==(a+b-1-l)) printf("."); printf("%d",crr[k]); } printf("\n"); } } } int remc(char *a)//找出'.'的位置 ,重定义数组,返回小数点后面的位数 { int l_a,i,j; l_a=strlen(a); for(i=0;i<l_a;i++){ if(a[i]<46 ||(a[i]>46 && a[i]<48 ) || a[i]>57)//检查是否输入的是数字 return -1; if(a[i]=='.'){ for(j=i;j<l_a;j++){ if(a[j+1]=='.')//检查是否出现重复'.' return -1; a[j]=a[j+1]; } return l_a-i-1; } } return 0; } int fun(char arr[],char brr[])//计算,返回数的位数 { int i,j,k=0,len_a,len_b,n=0,rem; len_a=strlen(arr);len_b=strlen(brr); for(i=len_a-1;i>=0;i--){ k=n++; rem=0; for(j=len_b-1;j>=0;j--){ rem=crr[k]+rem+(brr[j]-'0')*(arr[i]-'0'); crr[k]=rem%10; k++; rem/=10; } if(rem>0){ crr[k++]=rem; } } return k; } int jcmwl(int k)//检查小数点末尾无效的零,并去掉,返回去掉零的个数 { int i,m=0; while(!crr[0]){ for(i=0;i<k-m-1;i++){ crr[i]=crr[i+1]; } m++; } if(m!=0) crr[i]='\0'; return m; }