要说的都在注释里
#include<cstdio> #include<cstring> #define MAX 10010 #define LL strlen char INT_MAX[15]="2147483648"; int judge(char *str) { int len=LL(str),ok=LL(INT_MAX); if(len<ok)return 0; if(len==ok&&strcmp(INT_MAX,str)>0)return 0; else return 1; } void jia(const char *str1,char *str)//add str1 to str { int len1=LL(str1); int c=0;len1--; for(int i=MAX-2;i>=0;i--) { if(len1>=0)str[i]+=str1[len1--]-‘0‘; str[i]+=c; c=(str[i]-‘0‘)/10; str[i]=(str[i]-‘0‘)%10+‘0‘; } str[MAX-1]=‘\0‘; } void cheng(const char *str1,const char *str2,char *str)//高精度乘法 { int len1=LL(str1),len2=LL(str2),i,j; char ch[MAX];int k=2; for(i=len1-1;i>=0;i--) { memset(ch,‘0‘,sizeof(ch));ch[MAX-1]=‘\0‘; int c=0,f=MAX-k;//c为进位所加的数,f为最后一位的起始位 for(j=len2-1;j>=0;j--) { int temp=(str1[i]-‘0‘)*(str2[j]-‘0‘)+c; c=temp/10; ch[f--]=temp%10+‘0‘; } ch[f]+=c;int m=0; while(m<MAX-1&&ch[m]==‘0‘)m++; char s[MAX]; for(int p=0;m<MAX;m++,p++)s[p]=ch[m]; jia(s,str); k++;//进位 } //puts(str); i=-1;while(str[++i]==‘0‘&&i<(strlen(str)-1));//忽略前导0,最少panduan最后一位(个位) if(judge(&str[i]))puts("result too big"); //puts(&str[i]); } int main() { //freopen("input.txt","r",stdin); char str1[MAX],str2[MAX],str[MAX],num2[MAX],num1[MAX],ch; while(scanf("%s %c %s",num1,&ch,num2)==3){ getchar();int i=-1; memset(str1,‘\0‘,sizeof(str1));memset(str2,‘\0‘,sizeof(str2));//下面的几句处理前导0,注意不能用sizeof while(num1[++i]==‘0‘&&i<(LL(num1)-1));memcpy(str1,&num1[i],LL(num1)-i); i=-1; while(num2[++i]==‘0‘&&i<(LL(num2)-1));memcpy(str2,&num2[i],LL(num2)-i); memset(str,‘0‘,sizeof(str)); printf("%s %c %s\n",num1,ch,num2);//原样输出 if(judge(str1))puts("first number too big"); if(judge(str2))puts("second number too big"); if(ch==‘+‘){ jia(str1,str);jia(str2,str); i=-1;while(str[++i]==‘0‘&&i<(strlen(str)-1)); if(judge(&str[i]))puts("result too big"); //puts(str+i); } if(ch==‘*‘)cheng(str1,str2,str); } return 0; }
原文:http://blog.csdn.net/u013268685/article/details/20301285