HDU (1250 Hat's Fibonacci 高精度递加)

题目的意思:就是说s[1]=1,s[2]=1,s[3]=1,s[4]=1; 其他的都用统一方程求 s [ n ]=  s[n-1 ] +s [n -2 ] + s[ n-3 ] +s [ n-4];

题目分析:

其实没什么算法,就是用二维数组里的每一行 模拟每个一个大数,这一行里的第一个数就是 实际意义上的一个 “ 位 ”! 可以是以8位为一个“位”

也可以以其他位数为一“ 位 ”,这样做是为了压缩内存,也是位了能够高效模拟! 其他的跟我们 普通的加法是一样的!从左往右,把前面四行的对应的列上的值都加到 我这行的对应的列上来! 最后一个循环考虑一下,进位之类的  所以您别 一看就慌了 毕竟每个人都是由 不会到会的  如果有不懂的 您可以密我 我更详细的跟您解说{^ _ ^}

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
int s[10000][356]={0};
using namespace std;
int solve(){
	int i,j;
	s[1][1]=1;
	s[2][1]=1;
	s[3][1]=1;
	s[4][1]=1;
	for(i=5;i<10000;i++){
		for(j=1;j<=350;j++)
			s[i][j]+=s[i-1][j]+s[i-2][j]+s[i-3][j]+s[i-4][j];//记得这里别把j跟I弄混淆了,我第一次为这个小错误
            //找了点时间,嘿嘿
		for(j=1;j<=350;j++){
			if(s[i][j]>100000000){
				s[i][j+1]+=s[i][j]/100000000;
				s[i][j]=s[i][j]%100000000;
			}	
		}		
	}
	return 0;
}
int main(){
	int cas,i,j,n;
	solve();
	while(scanf("%d",&n)!=EOF){
		for(i=350;i>=1;i--){
			if(s[n][i]!=0)
				break;
		}
		printf("%d",s[n][i]);
		for(j=i-1;j>=1;j--)
			printf("%08d",s[n][j]);
		printf("\n");
	}
	return 0;
}