njuptxzy @ 2024-07-11 18:47:36
//使用高精度来进行求解
#include<iostream>
#include<cstring>
using namespace std;
struct big_num{
int a[10005];//用来储存大数字
int len;//这个大数字的长度
big_num(int x=0){//默认值为0
memset(a,0,sizeof(a));//初始化这个数组
for(len=1;x;len++){
a[len]=a[len]+x%10;
x/=10;
}
len--;
}
int &operator[](int i){//重载了一下这个[]使得c[2]=c.a[2];
return a[i];
}
void flatten(int L){
len=L;
for(int i=1;i<=len;i++){
a[i+1]+=a[i]/10;
a[i]%=10;
}
for(;!a[len];) len--;
}
void print(){
for(int i=len;i>=1;i--){
cout<<a[i];
}
}
};
big_num operator +(big_num a,big_num b){
big_num c;
int len=max(a.len,b.len);
for(int i=1;i<=len;i++)
{
c[i]+=a[i]+b[i];
}
c.flatten(len+1);
return c;
}
int main(){
int n;
cin>>n;
big_num a[n+1];//用来储存每一步数量的大小
a[1]=big_num(1);
a[2]=big_num(2);
for(int i=3;i<=n;i++)
{
a[i]=a[i-2]+a[i-1];
}
a[n].print() ;
return 0;
}
感觉就是一个正常的高精度思路?但是过不了最后一个数据点……
by Lyw_and_Segment_Tree @ 2024-07-11 18:53:03
@njuptxzy 是什么错误,WA 还是 RE 还是别的。
by wfirstzhang @ 2024-07-11 18:56:44
你可以只用三个数。这样就不会 MLE。
by I_never_give_up @ 2024-07-11 19:13:14
你是照着深入浅出上写的吗?它的高精有问题,不信你试一下最大值,它会输出一长串前导0
by Lyw_and_Segment_Tree @ 2024-07-11 19:18:12
@2609_LJC 啊?
by njuptxzy @ 2024-07-11 19:27:47
@Lyw_Cyq_01 是MLE(内存爆了)
by njuptxzy @ 2024-07-11 19:29:18
@wfirstzhang 只用三个数字?你是指在main函数中不断更新三个数字,而不使用数组来解?我来试试(
by I_never_give_up @ 2024-07-11 19:35:30
@Lyw_Cyq_01 额,我照着书上写就是输出一长串前导0,哪知道ta的代码直接不输出了
I'm sorry
by njuptxzy @ 2024-07-11 22:11:55
@wfirstzhang 感谢大佬,过啦