MC_OIer @ 2023-09-03 12:19:16
#include<bits/stdc++.h>
using namespace std;
int n,j,n3[505];
struct node{
int q[505]={0};
}ans[5005];
void add(int n1[],int n2[]){
for(j=1;n1[j]!=0||n2[j]!=0;j++){
n3[j]=n1[j]+n2[j];
if(n3[j]>9){
n3[j]-=10;
n3[j+1]++;
}
}
}
int main(){
cin>>n;
ans[1].q[1]=1;
ans[2].q[1]=2;
for(int i=3;i<=n;i++){
add(ans[i-1].q,ans[i-2].q);
for(int k=1;k<=505;k++)
ans[i].q[k]=n3[k];
}
if(ans[n].q[j]==0)j--;
while(j>0){
cout<<ans[n].q[j];
j--;
}
return 0;
}
by AstaSunch_ @ 2023-09-03 12:24:45
@linhaoyu2005 可以使用封装好的大整数类,CF 上有,而且这道题不就是求斐波那契数列的第
by MC_OIer @ 2023-09-03 13:27:17
@AstaTab 不会用啊
by AstaSunch_ @ 2023-09-03 13:30:13
@linhaoyu2005 或者你可以用 Python:
def fib(n):
if n <= 1:
return n
else:
a, b = 0, 1
for i in range(2, n+1):
c = a + b
a, b = b, c
return b
n = int(input())
print(fib(n+1))
by AstaSunch_ @ 2023-09-03 13:30:36
@linhaoyu2005 关注 Asta,谢谢喵
by Sqj147 @ 2023-09-28 14:48:41
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1050;// 1. 重复出现的数值定义一个 const 变量,和 define 类似
int n,jj = maxn,n3[maxn];
struct node{
int q[maxn]={0};// 2. 505 太小,需要 1050 位 以上
}ans[5005];// 3. 只需要两个或三个即可,不需要数组(如下)
/*
int a = 1, b = 1, sum = 1;
for (int i = 3; i <= n + 1; ++ i) {
a = b;
b = sum;
sum = a + b;
}
cout << sum << "\n";
*/
void add(int n1[],int n2[]){
for (int j = 1; j < maxn; j++) n3[j] = n1[j] + n2[j];
// for(j=1;n1[j]!=0||n2[j]!=0;j++){// 4. 如果是 1 1 0 1 + 1 1 0 1,你这个遇 0 退出,显然不对
for (int j = 1; j < maxn; j++){
/*
5. 这里你用的全局变量 j ,但是函数调用 add很多次,
每次 j 要从 1 开始才行,所以全局变量不要随便用,要了解清楚再用
6. n3[j] = n1[j]+n2[j];// 这里 "=" 相当于把下面的进位都丢掉了
因为这里你用的是 5000 的数组,所以进位非丢不可,而 n3[j] 初始值为 0,而非 n2[j],
所以一边修改 n3[j],一边要保留进位是不行的
这里将 相加 和 处理进位 分开
*/
if(n3[j] > 9){
// n3[j + 1] += (n3[j] / 10);// 进位
// n3[j] %= 10;// 本位
n3[j]-=10;// 与上述注释代码等价
n3[j+1]++;
}
}
}
int main(){
cin>>n;
ans[1].q[1]=1;
ans[2].q[1]=2;
for(int i=3;i<=n;i++){
add(ans[i-1].q,ans[i-2].q);
for(int k=1;k<=maxn;k++)
ans[i].q[k]=n3[k];
}
// if(ans[n].q[j]==0) j--;
for (; jj > 0 && ans[n].q[jj] == 0; jj --);// 去除前置 0
while(jj>0){
cout<<ans[n].q[jj];
jj--;
}
system("pause");
return 0;
}
by Sqj147 @ 2023-09-28 14:51:01
#include <bits/stdc++.h>// 如何解决实际问题
using namespace std;// 如何更快形成方案思路
typedef long long ll;// 如何降低时间复杂度
typedef pair<int, int> PII;
const int maxn = 1050;
int a[maxn], b[maxn], c[maxn];
int main()
{
int n, k = maxn;
cin >> n;
a[0] = b[0] = c[0] = 1;// int a = 1, b = 1, sum = 1;
for (int i = 3; i <= n + 1; ++ i) {
for (int j = 0; j < maxn; ++ j) a[j] = b[j];// a = b
for (int j = 0; j < maxn; ++ j) b[j] = c[j];// b = c
// for (int j = 0; j < maxn; ++ j) c[j] += a[j];// c = a + b
for (int j = 0; j < maxn; ++ j) {
c[j] += a[j];// c = a + b;
if (c[j] > 9) {
c[j + 1] += (c[j] / 10);
c[j] %= 10;
}
}
}
for (; k >= 0 && c[k] == 0; -- k);
for (; k >= 0; -- k) cout << c[k];
cout << "\n";
system("pause");
return 0;
}