高精度加减法 1000阶乘求法

1000的阶乘 2568位


#include <iostream.h> #include <string.h> #include <stdlib.h> #include <math.h> void fun(const char *a,const char *b ,char *c) { int index; if (a[0]>'0'&&b[0]>'0')//两个正数相加 { index=0; } if (a[0]=='-'&&b[0]=='-')//两个负数相加 { index=2; } if (a[0]>'0'&&b[0]=='-')//a+,b- { index=1; } if (a[0]=='-'&&b[0]>'0') { index=3; } switch(index) { case 0: { int remainder=0; int length=strlen(a)>strlen(b)?strlen(a):strlen(b); for (int i=strlen(a)-1,j=strlen(b)-1;i>=0||j>=0;i--,j--) { int x1,x2; if (i>=0) x1=a[i]-'0'; else x1=0; if (j>=0) x2=b[j]-'0'; else x2=0; div_t temp=div(x1+x2+remainder,10); remainder=temp.quot; c[length--]=temp.rem+'0'; } if(remainder!=0) c[0]=remainder+'0'; else { for (int i=0;i<strlen(c);i++) { c[i]=c[i+1]; } } } break; case 1: { if (strlen(a)>strlen(b)-1||strlen(a)==strlen(b)-1&&strcmp(a,b+1)>=0)//a-b为+ { int remainder=0; for (int i=strlen(a)-1,j=strlen(b)-1;i>=0||j>0;i--,j--) { int x1,x2; if (i>=0) { x1=a[i]-'0'; } else { x1=0; } if (j>0) { x2=b[j]-'0'; } else { x2=0; } int value=x1-x2+remainder; if (value>=0) { c[i]=value+'0'; remainder=0; } else { c[i]=value+10+'0'; remainder=-1; } } } else { int remainder=0; for (int i=strlen(a)-1,j=strlen(b)-1;i>=0||j>0;i--,j--) { int x1,x2; if (i>=0) { x1=a[i]-'0'; } else { x1=0; } if (j>0) { x2=b[j]-'0'; } else { x2=0; } int value=x2-x1+remainder; if (value>=0) { c[j]=value+'0'; remainder=0; } else { c[j]=value+10+'0'; remainder=-1; } } c[0]='-'; } } break; case 2: { int length=strlen(a)>strlen(b)?strlen(a):strlen(b); int remainder=0; for (int i=strlen(a)-1,j=strlen(b)-1;i>0||j>0;i--,j--) { int x1,x2; if (i>0) x1=a[i]-'0'; else x1=0; if (j>0) x2=b[j]-'0'; else x2=0; div_t temp=div(x1+x2+remainder,10); remainder=temp.quot; if (i>=j) { c[i+1]=temp.rem+'0'; } else { c[j+1]=temp.rem+'0'; } } if(remainder!=0) { c[1]=remainder+'0'; c[0]='-'; } else { c[0]='-'; for (int i=1;i<=length+3;i++) { c[i]=c[i+1]; } } } break; case 3: { if (strlen(b)>strlen(a)-1||strlen(b)==strlen(a)-1&&strcmp(b,a+1)>=0)//b-a为+ { int remainder=0; for (int i=strlen(b)-1,j=strlen(a)-1;i>=0||j>0;i--,j--) { int x1,x2; if (i>=0) { x1=b[i]-'0'; } else { x1=0; } if (j>0) { x2=a[j]-'0'; } else { x2=0; } int value=x1-x2+remainder; if (value>=0) { c[i]=value+'0'; remainder=0; } else { c[i]=value+10+'0'; remainder=-1; } } } else { int remainder=0; for (int i=strlen(a)-1,j=strlen(b)-1;i>0||j>=0;i--,j--) { int x1,x2; if (i>0) { x1=a[i]-'0'; } else { x1=0; } if (j>=0) { x2=b[j]-'0'; } else { x2=0; } int value=x1-x2+remainder; if (value>=0) { c[i]=value+'0'; remainder=0; } else { c[i]=value+10+'0'; remainder=-1; } } c[0]='-'; } } break; } } void main() { char sum[10000]={'\0'}; char temp1[10000]={'\0'}; char temp2[10000]={'\0'}; sum[0]='1'; for (int i=2;i<=20;i++) { memset(temp2,0,10000); strcpy(temp2,sum); for (int j=1;j<=i-1;j++) { memset(temp1,0,10000); strcpy(temp1,sum); fun(temp1,temp2,sum); } cout<<sum<<endl; } //cout<<sum<<endl; }
原文地址:https://www.cnblogs.com/GoAhead/p/2677522.html