大数运算

大数加法:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define M 100
 5 char *add(char s1[],char s2[]);
 6 int main(){
 7     char s1[M],s2[M],*s;        //此时不能使用strlen(s),s没有初始化。
 8     scanf("%s",&s1);
 9     printf("+
");
10     scanf("%s",&s2);
11     printf("=
");
12     s=add(s1,s2);                //必须同为指针类型
13     printf(s);
14     printf("
");
15 }
16 
17 char *add(char s1[],char s2[]){
18     int i,j,t,m,max,len1,len2;
19     int a[M],b[M],c[M];
20     char *s;
21     s=(char*)malloc(M*sizeof(char));     //分配内存是为了返回该指针时内有数据。
22     len1=strlen(s1);
23     len2=strlen(s2);
24     for(i=0,j=len1-1;i<len1;i++,j--)
25         a[i]=s1[j]-'0';                    //做整形时a[0]存放的是数的最低位个位
26     for(i=0,j=len2-1;i<len2;i++,j--)
27         b[i]=s2[j]-'0';
28     max=len1>len2?len1:len2;
29     t=0;m=0;
30     if(len1==max)                            //将小的数后面用0补全,不然后面对位相加时会出现问题
31         for(i=len2;i<max;i++)b[i]=0;
32     else
33         for(i=len1;i<max;i++)a[i]=0;
34     for(i=0;i<max;i++){                        //对位相加
35         t=a[i]+b[i]+m;
36         m=t/10;
37         c[i]=t%10;
38     }
39     if(m!=0)                                //最高是否进位
40         c[i]=m;
41     else 
42         i--;
43     for(j=0;i>=0;i--,j++){
44         s[j]=c[i]+'0';
45         //printf("%d",c[i]);
46     }
47     s[j]='';                                //字符串结束符,不然会输出“烫烫。。。”
48     return s;
49 }

大数减法:

 1 char *sub(char s1[],char s2[]){
 2     int a[M],b[M],c[M];
 3     int i,j,t,m,len1,len2,max;
 4     char *s=(char*)malloc(M*sizeof(char));
 5     len1=strlen(s1);
 6     len2=strlen(s2);
 7     max=len1>len2?len1:len2;
 8     if(len1>len2||(len1==len2&&s1[0]>=s2[0])){//s1>=s2   
 9     for(i=0,j=len1-1;i<len1;i++,j--)                        //使a[]为较大数,b[]为较小数
10         a[i]=s1[j]-'0';
11     for(i=0,j=len2-1;i<len2;i++,j--)
12         b[i]=s2[j]-'0';
13     for(i=len2;i<max;i++)                                  //将小的数高位用0补齐
14             b[i]=0;
15     s[0]=' ';                                                            //正数
16     }
17     else {                                                                //s1<s2        
18     for(i=0,j=len1-1;i<len1;i++,j--)
19         b[i]=s1[j]-'0';
20     for(i=0,j=len2-1;i<len2;i++,j--)
21         a[i]=s2[j]-'0';
22     for(i=len1;i<max;i++)
23             b[i]=0;
24     s[0]='-';                                                    //负数
25     }
26     
27     m=0;
28     for(i=0;i<max;i++){                                    //对位相减
29         t=a[i]-b[i]+m;
30         if(t<0){
31             c[i]=t+10;
32             m=-1;
33         }
34         else{
35             c[i]=t;
36             m=0;
37         }
38     }
39     for(i=max-1,j=1;i>=0;i--,j++)
40         s[j]=c[i]+'0';
41     i=1;                                                        //删除字符串之前的0
42     while(s[i]=='0'&&i<j-1)
43         i++;
44     for(j=1;i<=max;j++,i++)
45         s[j]=s[i];
46     s[j]='';
47     return s;
48 }
原文地址:https://www.cnblogs.com/zzsf/p/3887080.html