HDU1250 大整数问题

/*

按照大整数的模版来;

这个类型的斐波纳数列是前四项和,那么我们就讲其称为s1,s2,s3,s4,那么四项和即为s1+s2与s3+s4的和;

运用一个知识点,就是二维数组str[n][m] 的第i行的起始地址为str[i];

代码如下:

*/


#include<stdio.h>
#include<string.h>
int F[7061][550],c[550];  //7060时位数为2012 
const int Base=10000;
//万进制 int 最大,如果只用 +,-,可加大Base=1000000000
int ONE[]={1,1}; //大整数 1
int ZERO[]={1,0}; //大整数 0
int comp(int *a, int *b);//大整数比较大小
void Prin(int *a);//printf 大整数a
void copy(int *a, int *b);// 赋值a=b
void add(int *a,int *b,int *c);//大整数+大整数    c=a+b

void Prin(int *a)
{
	int i;//输出 "%04d" 10000进制
	printf("%d", a[a[0]]);
	for(i=a[0]-1;i>=1;i--)printf("%04d", a[i]);printf("\n");
}

void copy(int *a, int *b)
{ 
	int i;  //a=b
	for(i = 0;i<= b[0]; ++i)
		a[i] = b[i];
}

void add(int *A,int *B, int *sum)
{
	int i,d[1000];
	if((B[0]==1)&&(B[1]==0)){copy(sum,A);return;}
	if((A[0]==1)&&(A[1]==0)){copy(sum,B);return;}
	if (A[0] >= B[0]) { copy(sum,A);copy(d,B);} 
	else { copy(sum,B);copy(d,A);}
	
	//转换为sum + d(即A、B的最大值和最小值);最终结果为sum 
	sum[sum[0] + 1] = 0;   //存放可能出现的进位 
	for (i = 1; i <= d[0]; i++) //处理位数相同的 
	{
	    sum[i]+=d[i];     
	    if (sum[i]>=Base)
		{
	      sum[i]-=Base;
		  sum[i+1]++; 
		} 
	}    
	for (; i <= sum[0]; i++)  //处理A、B中大的多出来的位数 
	{
		if(sum[i]>=Base) 
		{
			sum[i] -= Base;
			sum[i+1]++;
		} 
		else break; 
	}
	if (sum[sum[0]+1]>0)sum[0] = sum[0] + 1;
}
int main()
{
	int i,j,k,m,n;
	for(i=1;i<=4;i++)copy(F[i],ONE);
	for(i=5,j=3,k=1;i<=7050;i++,j++,k++)
	{
	add(F[k],F[k+1],F[0]);
	add(F[j],F[j+1],c); 
	add(c,F[0],F[i]);
	}
	while(scanf("%d",&n)!=EOF)
	{
		Prin(F[n]);                 
	}  
}


你可能感兴趣的:(HDU,HDU,大数问题)