大数相乘

来源:互联网 发布:网络媒介公司 编辑:程序博客网 时间:2024/06/10 22:52
昨晚闲着无聊,试着写下大数相乘,看看初起到时候问题多多,不过整体思路还是对的我想法是用字符数组处理,有两个字符数组,用一个字符数组的每个元素分别和另一个数组的每个元素相乘,把他们的乘积保存在另一个数组中,当然其中也是有点小技巧的,最开始的源码如下:
#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;}

原创粉丝点击