高精度加减法 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/archive/2012/09/09/2677522.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值