Loading...
刷学校OJ,刷了几题遇到个斐波拉契数列的题目,自认为很简单,用了int型去处理,但是结果总时不对,因为斐波拉契后面的值太大了,OJ要求输出1000项大,用long long都不能处理,于是询问了学长,得知了大数运算,并且学习了大数加法,经过了各种查资料以及相关测试,最终写出了以下代码,并且AC。
原题:![原题][1]
#define N 500
void full(int n1[N], int n2[N]) //用于数组的赋值 把n2赋值给n1
{
for (int i = 0; i < 500; i++)
{
n1[i] = n2[i];
}
}
int main()
{
int n = 0;
while (scanf("%d", &n) && n) //输入项数并且为0时结束
{
int t1[N] = { 0 };
int t2[N] = { 0 };
int sum[N] = { 0 };
int temp[N] = { 0 }; //空数组,用于清零数组的
t1[0] = t2[0] = 1;
for (int i = 2; i < n; i++)
{
for (int k = 0; k < N; ++k)
{
sum[k] += t1[k] + t2[k];
if (sum[k] > 9)
{
sum[k + 1]++;
sum[k] -= 10;
}
}
full(t1, t2); //t2给t1
full(t2, sum); //sum 给t2
full(sum, temp); //再把sum清零
}
for (int i = N-1; i >= 0; i--) //输出
{
if (t2[i] != 0)
{
for (int k = i; k >= 0; k--)
printf("%d", t2[k]);
printf("\n");
break;
}
}
}
return 0;
}
如上代码,N表示最高支持的长度,我这设置成了500(题目表示1000位数以内),不够可以加。
这段代码中还写了一个full函数,用于进行数组的赋值的(我们知道数组之间是不能直接赋值的)。
相关的东西注释也写的比较清楚了。
有更好的思路也会再次总结。
学长表示把int数组转换为字符串可以更加高效率,以后再研究了。
[1]: https://www.oylong.com/usr/uploads/2018/10/1.jpg
最后修改:2019 年 02 月 26 日 07 : 13 PM
© 允许规范转载
赞赏
如果觉得我的文章对你有用,请随意赞赏
×Close
赞赏作者
扫一扫支付
支付宝支付
微信支付