Xecades @ 2019-08-08 10:38:27
我用结构体来存储计算,重载加法运算符,结构体高精加法代码是从以前A了的题里面copy来的,应该没错,但是这道题就爆炸了,就是不管怎么算,得出的数字都只有一位数,我先是认为是没重载等号,重载了还是不行,但如果我这样用:
calc a=(string)"5888546645634754",b=(string)"534357657584324564347585434";
calc c=a+b;
c.out();
没毛病,这是递归的锅吗?
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=5010;
int n;
struct calc
{
ll len;
ll s[maxn];
calc() {len=0;memset(s,0,sizeof s);}
calc(string str)//将string类型转为calc类型
{
len=str.length();
for(ll i=0;i<len;i++)
s[i+1]=str[i]-'0';
}
calc(ll* str,ll l)
{
len=l;
for(ll i=0;i<=len;i++)
s[i+1]=str[i];
}
calc operator+(calc k)//高精加法多半没错
{
calc ans;
memset(ans.s,0,sizeof(ans.s));
ll ks[maxn]={0},ts[maxn]={0},tmp[maxn]={0};
ll length=max(len,k.len)+1;
for(ll i=1;i<=k.len;i++)
ks[i]=k.s[k.len-i+1];
for(ll i=1;i<=len;i++)
ts[i]=s[len-i+1];
for(ll i=1;i<=length;i++)
{
tmp[i]+=ks[i]+ts[i];
tmp[i+1]=tmp[i]/10;
tmp[i]%=10;
}
ll left=length;
while(tmp[left]=='0')
left--,length--;
left--;
for(;left>0;left--)
ans.s[length-left]=tmp[left];
ans.len=length-1;
return ans;
}
void out()//输出
{
for(ll i=1;i<=len;i++)
cout<<s[i];
}
};
calc fib[maxn];//就算我不用数组,还是不行
int main()
{
cin>>n;
fib[1]=(string)"1";//fib[1]值为1,长度为1
for(int i=2;i<=n+1;i++)
fib[i]=fib[i-1]+fib[i-2];//爆炸现场
fib[n+1].out();
return 0;
}
by t162 @ 2020-01-11 11:40:35
@Xecades 您的len從來都沒更新過
by Xecades @ 2020-01-15 21:58:10
@Bambusoideae 噢!谢谢你(虽然重写已经A了