两个大数相乘(纯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 }

 

posted @ 2013-05-07 16:57  Please Call me 小强  阅读(396)  评论(0编辑  收藏  举报