60分求助(其实是蒟蒻高精度不会)

P1255 数楼梯

```cpp #include<bits/stdc++.h> using namespace std; int len=1,f[5005][5005]; void add(int k){ for(int i=1;i<=len;i++) f[k][i]=f[k-1][i]+f[k-2][i]; for(int i=1;i<=len;i++) if(f[k][i]>=10){ f[k][i+1]+=f[k][i]/10; f[k][i]=f[k][i]%10; if(f[k][len+1])len++; } } int main(){ int n; cin>>n; f[1][1]=1; f[2][1]=2; for(int i=3;i<=n;i++) add(i); for(int i=len;i>=1;i--) cout<<f[n][i]; return 0; } ```
by wang1h @ 2024-04-14 19:35:22


@[tlsonghangtong](/user/1056451)
by wang1h @ 2024-04-14 19:35:43


@[tlsonghangtong](/user/1056451) ```cpp #include<bits/stdc++.h> using namespace std; #define maxn 2000 struct Bigint{ int len,a[maxn]; Bigint(int x=0){ memset(a,0,sizeof(a)); for(len=1;x;len++)a[len]=x%10,x/=10; len--; }int &operator[](int c){ return a[c]; }void flatten(int L){ len=L; for(int c=1;c<=len;c++){ a[c+1]+=a[c]/10;a[c]%=10; }for(;!a[len];)len--; }void print(){ for(int c=max(len,1);c>=1;c--)cout<<a[c]; } };Bigint operator+(Bigint a,Bigint b){ Bigint ans; int len=max(a.len,b.len); for(int c=1;c<=len;c++)ans[c]+=a[c]+b[c]; ans.flatten(len+1); return ans; }int main(){ int n;cin>>n; Bigint f[5010]; f[1]=Bigint(1); f[2]=Bigint(2); for(int c=3;c<=n;c++)f[c]=f[c-1]+f[c-2]; f[n].print(); } ``` 封装高精结构体
by xd244 @ 2024-04-14 19:42:30


@[xd244](/user/1153793) @[wang1h](/user/556072) 已关,但能不能在我的代码上改?
by tlsonghangtong @ 2024-04-17 16:35:26


@[tlsonghangtong](/user/1056451) 好的: ```cpp #include<bits/stdc++.h> using namespace std; #define maxn 2000 struct Bigint{ int len,a[maxn]; Bigint(int x=0){ memset(a,0,sizeof(a)); for(len=1;x;len++)a[len]=x%10,x/=10; len--; }int &operator[](int c){ return a[c]; }void flatten(int L){ len=L; for(int c=1;c<=len;c++){ a[c+1]+=a[c]/10;a[c]%=10; }for(;!a[len];)len--; }void print(){ for(int c=max(len,1);c>=1;c--)cout<<a[c]; } }; Bigint operator+(Bigint a,Bigint b){ Bigint ans; int len=max(a.len,b.len); for(int c=1;c<=len;c++)ans[c]+=a[c]+b[c]; ans.flatten(len+1); return ans; } Bigint ans[5010];//记录答案 bool ansed[5010];//记录答案是否已经搜索过 Bigint f(int n){ if(n==1)return Bigint(1); if(n==2)return Bigint(2); if(n==3)return Bigint(4); if(ansed[n]!=0)return ans[n]; return ans[n]=f(n-1)+f(n-2)+f(n-3); }int main(){ int n;cin>>n; f(n).print(); } ```
by xd244 @ 2024-04-17 20:30:01


@[xd244](/user/1153793) 谢谢
by tlsonghangtong @ 2024-04-21 08:56:52


@[xd244](/user/1153793) 高精度20分
by tlsonghangtong @ 2024-04-21 09:04:20


@[tlsonghangtong](/user/1056451) 其实我认为你用封装结构体不用写那麽多代码 况且我想问一下问什么要加f(n - 3)~~因为我看这道题是用斐波那契数列的~~ 或许你可以这样写 ```cpp void add_CHY(int x,int y){ int max_len = max(edge[x].a_len,edge[y].a_len); for(int j = 0;j < max_len;j++){ edge[i].a[j] += edge[x].a[j] + edge[y].a[j]; if(edge[i].a[j] > 9){ edge[i].a[j + 1]++; edge[i].a[j] %= 10; } } if(edge[i].a[max_len] != 0){ max_len++; } edge[i].a_len = max_len; return; } ``` ~~不喜勿喷~~
by Before_Dream @ 2024-05-01 16:20:39


|