高精又双叒叕出错了。。。。。。

P1255 数楼梯

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 上有,而且这道题不就是求斐波那契数列的第 n+1 项么,所以关注 Asta 谢谢喵


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;
}

|