kIG7Z8oP @ 2019-10-30 20:38:13
一个点WA了,还有一个R了,不让下数据嘤嘤
#include<cstdio>
int n;
void swap(int &a,int &b)
{
int t=a;
a=b,b=t;
}
struct hg_int
{
int len,val[3000];
void init()
{
len=0;
}
void turn()
{
for(int i=0,j=len-1;i<j;i++,j--)
swap(val[i],val[j]);
}
void operator = (int tmp)
{
while(tmp) val[len++]=tmp%10,tmp/=10;
}
void operator = (hg_int tmp)
{
len=tmp.len;
for(int i=0;i<len;i++)
val[i]=tmp.val[i];
}
hg_int operator + (hg_int tmp)
{
int lenmx=len;
if(tmp.len>len) lenmx=tmp.len;
for(int i=0;i<lenmx;i++)
tmp.val[i]+=val[i];
for(int i=0;i<lenmx;i++)
tmp.val[i+1]+=tmp.val[i]/10,tmp.val[i]%=10;
if(tmp.val[lenmx]) lenmx++;
tmp.len=lenmx;
return tmp;
}
void otp()
{
for(int i=len-1;i>=0;i--)
putchar(val[i]+48);
}
}a[2501];
int main()
{
scanf("%d",&n);
a[0]=1;
a[1]=1;
for(int i=2;i<=n;i++)
a[i].init();
for(int i=2;i<=n;i++)
a[i]=a[i-1]+a[i-2];
a[n].otp();
}
by kIG7Z8oP @ 2019-10-30 20:40:37
救命~
by Yo_haor @ 2019-11-21 12:58:28
看得不是太懂,但我过了,可能有点麻烦,若有优化方法,请指出qwq
(解释在代码里qwq)
上代码:
#include<iostream>
using namespace std;//学学dalao一个文件头
int n;
string f[5010];//定义字符串数组
string jia(string x,string y){//高精度加法
string t="";//等会返回的值
if(x.size()>y.size())//设置好前导0
for(int i=1;i<=x.size()-y.size();i++)y='0'+y;
if(x.size()<y.size())//设置好前导0
for(int i=1;i<=y.size()-x.size();i++)x='0'+x;
int jw=0,a,b,c;
for(int i=x.size()-1;i>=0;i--){//进行加法
a=int(x[i]-48),b=int(y[i]-48),c=a+b+jw;
if(c>9)jw=1;//判读是否进位
else jw=0;
c=c%10;//求出当前为数的值
t=char(c+48)+t;//进行累加
}
if(jw==1)t='1'+t;//切记切记不要忘记,结尾可能还是进位qwq
return t;
}
int main(){
cin>>n;
f[0]='0',f[1]='1',f[2]='2';//记得初始化,切记切记不要忘了0(我被坑过┬_┬)
for(int i=3;i<=n;i++)
f[i]=jia(f[i-1],f[i-2]);//一步步递推
cout<<f[n];//输出结果f[n]
return 0;
}
希望对你有帮助