1005Number Sequence

本文通过解决一个递归算法在大数值输入下出现的溢出问题,介绍了鸽巢原理的应用。从初次尝试使用递归方法失败,到采用循环优化依然无法解决问题,最终通过理解鸽巢原理解决了难题。
//第一次错误尝试
/*
#include<iostream>
using namespace std;

unsigned f(unsigned a, unsigned b, unsigned n)
{
    if(n == 1 || n == 2)
        return 1;
    return (a * f(a, b, n-1) + b * f(a, b, n-2)) % 7;
}
int main()
{
    unsigned a, b, n;
    while(cin >> a >> b >> n, a !=0 && b != 0 && n != 0)
        cout << f(a, b, n) << endl;
    return 0;
}


*/
/*
1 1 3
1 2 10
0 0 0
*/
/*
//第二次错误尝试
#include<iostream>
using namespace std;

unsigned long f(unsigned long a, unsigned long b, unsigned long n)
{
    if(n == 1 || n == 2)
        return 1;
    return (a * f(a, b, n-1) + b * f(a, b, n-2)) % 7;
}
int main()
{
    unsigned long a, b, n;
    while(cin >> a >> b >> n, a !=0 && b != 0 && n != 0)
        cout << f(a, b, n) << endl;
    return 0;
}

*/
//本题先是用递归,但发现输入最大那个数100000000时总是溢出导致程序崩溃。
//后来想想是不是递归栈到极限了,改用for循环做,结果还是没噶最后只能上网求助。
//发现原来是鸽笼原理(又名:抽屉原理),数学啊,长见识了……又学到新知识了。。。
//本题应用:鸽笼原理

//网上搜到的代码
#include<iostream>
using namespace std;

int main()
{
    const size_t array_size = 50;
    int a, b, n, parr[array_size] = {0, 1, 1};
    while(cin >> a >> b >> n, a !=0 && b != 0 && n != 0)
    {
        for(size_t ix = 3; ix != array_size; ++ix)
            parr[ix] = (a * parr[ix - 1] + b * parr[ix - 2]) % 7;
        cout << parr[n%49] << endl;
    }
    return 0;
}


同时欢迎提出不同意见,以帮助我改进,不胜感激!!!

——桑海整理


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值