#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int f[1010][1010],pow[1010][1000];
int main()
{
int n,i,j,c,s;
memset(f,0,sizeof(f));
f[0][0]=0;
f[1][0]=0;
f[2][0]=1;
memset(pow,0,sizeof(pow));
pow[0][0]=1;
for(i=1;i<=1000;i++)
for(j=0,c=0;j<1000;j++)
{
s=(pow[i-1][j]<<1)+c;//注意位运算的优先级
c=s/10;
pow[i][j]=s%10;
}
for(i=3;i<=1000;i++)
for(j=0;j<1000;j++)
{
s=c+f[i-2][j]+pow[i-3][j];
c=s/10;
f[i][j]=s%10;
}
while(scanf("%d",&n)!=EOF)
{
if(n-1)//注意当n==1时输出应为0,应特殊考虑
{
i=1000;
while(!f[n][--i]);
for(;i>=0;i--)
printf("%d",f[n][i]);
}
else
printf("0");
printf("\n");
}
return 0;
}HDU 1041 Computer Transformation
最新推荐文章于 2021-02-04 09:33:11 发布
本文介绍了一个使用C语言实现的算法,通过位运算和数组处理来解决特定数学问题。程序初始化了两个二维数组f和pow,并利用双重循环进行填充。通过对数组元素的操作实现了特定的递推关系,解决了涉及数位计算的问题。
1291

被折叠的 条评论
为什么被折叠?



