2790: 菲波那契数列
//斐波那契数列问题
#include <bits/stdc++.h>
using namespace std;
int n, a, ans[1000010];
int main()
{
ans[1]=1;
ans[2]=1;
for(int i=3; i<=1000000; ++i){
ans[i]=(ans[i-1]+ans[i-2])%1000;
}
scanf("%d", &n);
while(n--){
scanf("%d", &a);
printf("%d\n", ans[a]);
}
return 0;
}
1159: 【基础】爬楼梯
//斐波那契数列问题, 爬楼梯问题
#include <bits/stdc++.h>
using namespace std;
int n;
long long ans[210];
int main()
{
scanf("%d", &n);
ans[1]=1;
ans[2]=2;
for(int i=3; i<=n; ++i){
ans[i]=ans[i-1]+ans[i-2];
}
printf("%lld", ans[n]);
return 0;
}
2723: 【基础】取糖果
这是一道高精度斐波那契数列的题目
低精度部分分做法,60%AC
//斐波那契数列问题, 爬楼梯问题
#include <bits/stdc++.h>
using namespace std;
int n;
long long ans[210];
int main()
{
scanf("%d", &n);
ans[1]=1;
ans[2]=2;
for(int i=3; i<=n; ++i){
ans[i]=ans[i-1]+ans[i-2];
}
printf("%lld", ans[n]);
return 0;
}
高精度AC代码
#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
int len=0;
int num[2000]={0};
}ans[210];
node operator + (node x, node y)
{
node sum;
sum.len=max(x.len, y.len);
for(int i=1; i<=sum.len; ++i){
sum.num[i]+=x.num[i]+y.num[i];
sum.num[i+1]+=sum.num[i]/10;
sum.num[i]%=10;
}
if(sum.num[sum.len+1]){
sum.len++;
}
return sum;
}
int main()
{
scanf("%d", &n);
ans[1].len=1;
ans[1].num[1]=1;
ans[2].len=1;
ans[2].num[1]=2;
for(int i=3; i<=n; ++i){
ans[i]=ans[i-1]+ans[i-2];
}
for(int i=ans[n].len; i>=1; --i){
printf("%d", ans[n].num[i]);
}
return 0;
}
2789: 【基础】过河卒简版
1162: 【NOIP02普及组】过河卒
2792: 【基础】Hanoi塔问题
递推
#include <bits/stdc++.h>
using namespace std;
int n, ans[31];
int main()
{
scanf("%d", &n);
ans[1]=1;
for(int i=2; i<=n; ++i){
ans[i]=2*ans[i-1]+1;
}
printf("%d", ans[n]);
return 0;
}
2^n-1步
#include <bits/stdc++.h>
using namespace std;
int n, ans;
int main()
{
scanf("%d", &n);
ans=pow(2, n)-1;
printf("%d", ans);
return 0;
}