http://acm.hdu.edu.cn/showproblem.php?pid=1041
分析:(见图片,貌似有点大,见最后)
重要的就一句话:本次"00"的个数等于上一次"00"个数+上一次"11"个数+0或者1
#include<stdio.h>
#include<string.h>
#define N 200
//定义大整数,每个digit[i]表示四位数字,size表示尚未使用的digit。
//即,最高位是digit[size-1]
typedef struct{
int digit[N];
int size;
}bigint;
//zeros记录"00"个数,ones记录"11"个数,o是bigint类型的数值“1”
bigint num[1003],zeros,ones,o;
int first;//记录首位是0,还是1.
int max(int x,int y){
return x>y?x:y;
}
//大整数加法
bigint add(bigint x,bigint y){
int carry=0,i;//carry记录进位
bigint a;
for(i=0;i<N;i++){
a.digit[i]=0;
}
a.size=max(x.size,y.size);
for(i=0;i<a.size;i++){
a.digit[i]=carry+x.digit[i]+y.digit[i];
carry=a.digit[i]/10000;//每个digit表示四位
a.digit[i]%=10000;
}
if(carry>0){//最后一位有进位,则
a.digit[a.size]=carry;
a.size++;
}
return a;
}
void output(bigint a){
printf("%d",a.digit[a.size-1]);
for(int i=a.size-2;i>=0;i--){
printf("%04d",a.digit[i]);
}
}
void init(){
int i;
//以下是初始化
memset(num,0,sizeof(num));
for(i=0;i<N;i++){
zeros.digit[i]=0;
ones.digit[i]=0;
o.digit[i]=0;
}
//第一次变化,"00"个数是0
num[1].digit[0]=0;
num[1].size=1;
//初始化"00""11"个数,初始值(第一次变化)都是0
zeros.digit[0]=0;
ones.digit[0]=0;
zeros.size=1;
ones.size=1;
//初始化o,o是代表数值"1"
o.digit[0]=1;
o.size=1;
first=0;//初始首位是0,然后1,0交替变化,即1-first
bigint temp;//中间变量
for(i=2;i<1001;i++){
temp=zeros;
if(first==0){
zeros=add(add(zeros,ones),o);
ones=add(temp,ones);
}
else{
zeros=add(zeros,ones);
ones=add(temp,ones);
}
first=1-first;
num[i]=zeros;
}
}
int main(){
int n;
init();
while(scanf("%d",&n)!=EOF){
output(num[n]);
puts("");
}
return 0;
}