ZOJ1828题解--大数计算
发布时间:2020-12-14 04:13:59 所属栏目:大数据 来源:网络整理
导读:说实话,这段代码也是参考别人的,都不好意思往外贴了。。。 ? 看这道题吧,题目叙述很简单,就是我们熟悉的斐波那契数列。不过我们要考虑到数据的存储问题。即使是用long来存储最后的结果也是不能表示的。而且采用非递归的方式来求解,因为递归时间太长了。
说实话,这段代码也是参考别人的,都不好意思往外贴了。。。 ? 看这道题吧,题目叙述很简单,就是我们熟悉的斐波那契数列。不过我们要考虑到数据的存储问题。即使是用long来存储最后的结果也是不能表示的。而且采用非递归的方式来求解,因为递归时间太长了。 所以只能考虑采用数组来存放每一位的.刚开始使用了vector动态开辟空间,定义了三个,分别表示加和,两个加数。然后就想着通过这三个数组的交换不断累加,总是在交换求中出错,而且每次都需要重新计算 ? 最后采用了查表的方式,先求出来存放到表中,这样就将计算减少到一次,开辟一个string的数组,来存放斐波那契数列。 #include <iostream> #include <string> using namespace std; string add(string s1,string s2) { int a[1010]={0}; int i,j,k=0,len1,len2; string s; len1=s1.size(); len2=s2.size(); for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--,k++)//最后的自加自减符合正常的运算法则,保证位数对其。 { if(i>=0) a[k]=a[k]+s1[i]-'0'; if(j>=0) a[k]=a[k]+s2[j]-'0'; if(a[k]>9) { a[k+1]=a[k+1]+1; a[k]=a[k]%10; } } s=""; for(i=k;i>=0;i--) { if(i==k) { if(a[k]!=0) s+=a[k]+'0';//追加到字符串,判断最高位是否有进位,有就考虑加到首位。 } else s+=a[i]+'0'; } return s; } int main() { string s[7000]; s[1]="1"; s[2]="1"; int n,i; for(i=3;i<=4800;i++) s[i]=add(s[i-1],s[i-2]); while(cin>>n) cout<<s[n]<<endl; return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |