典型大数题(解体模板)

/*求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 1000
int 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 1000
char 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;
}



你可能感兴趣的:(典型大数题(解体模板))