典型大数题(解体模板)

来源:互联网 发布:阿里云ddns客户端 编辑:程序博客网 时间:2024/05/01 20:51

/*求N的阶乘*/

(杭电---------N!)

代码如下:

#include<stdio.h>#include<string.h>#define M 10000000//刚开始开了100000结果溢出了 int a[M];int main(){int n,p,h,i,j;a[1]=1;p=1;h=0;//p表示每次运算时的位数,h表示进位 while(scanf("%d",&n)!=EOF){memset(a,0,sizeof(a));a[1]=1;p=1;h=0;if(n==0){printf("1\n");continue;}for(i=1;i<=n;i++){for(j=1;j<=p;j++){a[j]=a[j]*i+h;h=a[j]/10;a[j]=a[j]%10;}while(h>0)//进位数可能大于10 {a[j]=h%10;h=h/10;j++;}p=j-1;}for(i=p;i>=1;i--)printf("%d",a[i]);printf("\n");}return 0;}
/*大数与斐波纳切数列*/

/*杭电 ----- -1sting*/

#include<stdio.h>#include<string.h>#define M 1000int num[203][M];//用于大数计算 int len[1000];//记录每一个长度数组对应的输出结果的位数int main(){int n,k,l,i,j;//k表示进位 char b[203];len[1]=len[2]=1;memset(num,0,sizeof(num));//二维数组也可以这样清零 num[1][0]=1; num[2][0]=2;for(i=3;i<203;i++){k=0;for(j=0;j<=len[i-1];j++){l=num[i-1][j]+num[i-2][j]+k;num[i][j]=l%10;k=l/10;}if(num[i][j-1]!=0)len[i]=len[i-1]+1;else len[i]=len[i-1];}scanf("%d",&n);getchar();while(n--){scanf("%s",b);l=strlen(b);for(i=len[l]-1;i>=0;i--)/*此处一定要注意 i=len[l]-1 ,因为num数组是从第零列开始存入数据的 */ printf("%d",num[l][i]);printf("\n");}return 0;} 

/*巧用二维数组模拟了大数相加*/

/*大数求余*/

/*杭电---BigNumber*/

#include<stdio.h>#include<string.h>#define M 1000char a[M+5];int main(){    char b[7];    int l1,l2;    int x,y,j,i;    while(scanf("%s%s",a,b)!=EOF)    {        l1=strlen(a);        l2=strlen(b);        if(strcmp(a,b)==0)printf("0\n");        else if(l1<l2||(l1==l2&&strcmp(a,b)<0))printf("%s\n",a);        else        {        j=0;x=0;y=0;        for(i=0;i<l2;i++)        {            y=y*10+b[i]-'0';        }        for(i=0;i<l1;i++)        {                x=x*10+a[i]-'0';                if(x>=y)x=x%y;        }    printf("%d\n",x);}}return 0;}



0 0