大数运算
大数加法:
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("+\n"); 10 scanf("%s",&s2); 11 printf("=\n"); 12 s=add(s1,s2); //必须同为指针类型 13 printf(s); 14 printf("\n"); 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]='\0'; //字符串结束符,不然会输出“烫烫。。。” 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]='\0'; 47 return s; 48 }