代码说明:
//大数相加 #include <stdio.h> #include <string.h> #define MAXN 100 int an1[MAXN+10]; int an2[MAXN+10]; char str1[MAXN+10]; char str2[MAXN+10]; int main() { memset(an1,0,sizeof(an1)); int i,j; scanf("%s",str1); j=0; int len1=strlen(str1); for(i=len1-1;i>=0;i--) an1[j++]=str1[i]-'0'; while(~scanf("%s",str2)&&str2[0]!='0') { memset(an2,sizeof(an2)); j=0; int len2=strlen(str2); for(i=len2-1;i>=0;i--) an2[j++]=str2[i]-'0'; //下面是主要运算过程 for(i=0;i<MAXN;i++){ an1[i]+=an2[i]; if(an1[i]>=10){ an1[i]-=10; an1[i+1]++; } } //输出 int pan_0 = 0; for(i=MAXN;i>=0;i--){ if(pan_0) printf("%d",an1[i]); else if(an1[i]){ printf("%d",an1[i]); pan_0 = 1; } } printf("\n"); } return 0; } //大数相减 //改动主要运算过程 for(i=0;i<MAXN;i++){ an1[i]-=an2[i]; if(an1[i]<0){ an1[i]+=10; an1[i+1]--; } } //大数相乘 #include <stdio.h> #include <string.h> #define MAXN 100 int an1[MAXN*2+10]; int an2[MAXN+10]; int aresult[MAXN*2+10]; char str1[MAXN+10]; char str2[MAXN+10]; int main() { memset(an1,str1); j=0; int len1=strlen(str1); for(i=len1-1;i>=0;i--) an1[j++]=str1[i]-'0'; int duandian; duandian=len1-1; while(~scanf("%s",str2)&&str2[0]!='0') { memset(aresult,sizeof(aresult)); memset(an2,sizeof(an2)); j=0; int len2=strlen(str2); for(i=len2-1;i>=0;i--) an2[j++]=str2[i]-'0'; //下面是主要运算过程 for(i=0;i<duandian+1;i++) for(j=0;j<len2;j++) aresult[i+j]+=an1[i]*an2[j]; for(i=0;i<MAXN;i++){ if(aresult[i]>=10){ aresult[i+1]+=aresult[i]/10; aresult[i]%=10; } } //输出 memset(an1,sizeof(an1)); int pan_0 = 0; for(i=MAXN*2;i>=0;i--){ if(pan_0){ printf("%d",aresult[i]); an1[i]=aresult[i]; } else if(aresult[i]){ printf("%d",aresult[i]); duandian=i; an1[i]=aresult[i]; pan_0 = 1; } } printf("\n"); memset(str2,sizeof(str2)); } return 0; } //大数相除,两个数 //反复做减法,能减几个,商就是几。 #include <stdio.h> #include <string.h> #define MAXN 100 int an1[MAXN+10]; //被除数 int an2[MAXN+10]; //除数 int aresult[MAXN+10]; //商 char str1[MAXN+10]; char str2[MAXN+10]; //substract函数表示an1减去an2,返回结果的长度;不够返回-1;刚好返回0; int subtract(int *p1,int *p2,int len1,int len2) { int i; //判断p1是否比p2大,不是返回-1 if(len1<len2) return -1; int pan = 0; if(len1==len2){ for(i=len1-1;i>=0;i--){ if(p1[i]>p2[i]) pan = 1; else if(p1[i]<p2[i]){ if(!pan) return -1; } } } //p1不小于p2,做减法 for(i=0;i<len1;i++){ p1[i]-=p2[i]; if(p1[i]<0){ p1[i]+=10; p1[i+1]--; } } for(i=len1-1;i>=0;i--) if(p1[i]) return i+1; //一样大 return 0; } int main() { int t; scanf("%s",str1); scanf("%s",str2); int i,j; memset(an1,sizeof(an1)); memset(an2,sizeof(an2)); memset(aresult,sizeof(aresult)); j=0; int len1=strlen(str1); for(i=len1-1;i>=0;i--) an1[j++]=str1[i]-'0'; j=0; int len2=strlen(str2); for(i=len2-1;i>=0;i--) an2[j++]=str2[i]-'0'; //运用substract函数 len1=subtract(an1,an2,len1,len2); //情况1 if(len1<0){ printf("0\n"); } //情况2 else if(len1==0){ printf("1\n"); } //情况3 else { aresult[0]++; //已经减了一次,商加1 int times=len1-len2; if(times<0) //不能再减 goto output; else if(times>0){ for(i=len1-1;i>=0;i--){ if(i>=times) an2[i]=an2[i-times]; else an2[i]=0; } } //!!! len2=len1; for(j=0;j<=times;j++){ int tmp; while((tmp=subtract(an1,an2+j,len2-j))>=0){ len1=tmp; aresult[times-j]++; } } output: //进位 for(i=0;i<MAXN;i++){ if(aresult[i]>=10){ aresult[i+1]+=aresult[i]/10; aresult[i]%=10; } } //输出 int pan_0 = 0; for(i=MAXN;i>=0;i--){ if(pan_0){ printf("%d",aresult[i]); } else if(aresult[i]){ printf("%d",aresult[i]); pan_0 = 1; } } printf("\n"); } return 0; }