两个大数相乘(纯C实现)
闲着无聊,做了这个程序。可以计算1000位以内的数相乘。纯字符串处理。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 //两个字符串相加 5 char* add(char *s1,char *s2) 6 { 7 char c[200]; 8 char *s=c; 9 int i=strlen(s1)-1,j=strlen(s2)-1,k=0; 10 int flag=0; 11 int sum; 12 for(;i>=0&&j>=0;i--,j--,k++) 13 { 14 sum=(s1[i]-'0')+(s2[j]-'0')+flag; 15 (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0'); 16 } 17 for(;i>=0;i--,k++) 18 { 19 sum=(s1[i]-'0')+flag; 20 (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0'); 21 } 22 for(;j>=0;j--,k++) 23 { 24 sum=(s2[j]-'0')+flag; 25 (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0'); 26 } 27 if(flag) c[k++]='1'; 28 c[k]=0; 29 strrev(s); 30 return s; 31 } 32 //返回s1*num 0<=num<=10 33 char* mul(char *s1,int num) 34 { 35 if(num==1) return s1; 36 else if(num==0) return "0"; 37 else if(num==10) return strcat(s1,"0"); 38 int len1=strlen(s1); 39 char str[1000];//可以计算10000位以内的数 40 int temp=0;//表示要进位的数,如9*9=81 则num存储的是8 41 int j=0; 42 for(int i=len1-1;i>=0;i--) 43 { 44 int t=(s1[i]-'0')*num+temp; 45 str[j++]=t%10+'0'; 46 temp=t/10; 47 } 48 str[j++]=temp+'0'; 49 str[j]=0;//形成串 50 return strrev(str); 51 } 52 53 //获取一个数字串的后面的零 54 char* getZero(char *s1) 55 { 56 int len1=strlen(s1); 57 if(len1==0) return ""; 58 char *p= s1+len1; 59 while(*--p=='0'); 60 char result[1000]=""; 61 char *q=result; 62 strcpy(result,p+1); 63 p[1]=0;//修改源串,如源串为 123000 则源串变为 123 64 return q; 65 } 66 //返回 s1*s2 的结果 67 char* fun(char *s1,char *s2) 68 { 69 70 char ling[200]="";//存放零 71 strcat(ling,getZero(s1)); 72 strcat(ling,getZero(s2)); 73 int len1=strlen(s1); 74 int len2=strlen(s2); 75 char sum[1000] ="0"; 76 char t[1000]="";//存放0 77 char temp[1000]="";//存放临时结果 78 for(int i=len2-1;i>=0;i--) 79 { 80 strcat(t,"0"); 81 strcpy(temp,mul(s1,s2[i]-'0')); 82 strcat(temp,t); 83 strcpy(sum,add(sum,temp));//相当于 sum += temp; 84 } 85 sum[strlen(sum)-1]=0;//因为在for循环里多加了一个0,所以要去掉 86 return strcat(sum,ling); 87 } 88 int main() 89 { 90 char s1[1000]="1234567894946952659526488874568224285656"; 91 char s2[1000]="1235879542668895589898986598526852694"; 92 printf("%s x %s\n",s1,s2); 93 printf("= %s\n",fun(s1,s2)); 94 system("pause"); 95 return 0; 96 }