| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1109 人关注过本帖
标题:怎么根据递推公式证明会出现循环
取消只看楼主 加入收藏
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
结帖率:96.08%
收藏
已结贴  问题点数:20 回复次数:5 
怎么根据递推公式证明会出现循环
问题:http://acm.hdu.

我的代码:
程序代码:
#include<iostream>
using namespace std;

int numArry[3]={0};
int main()
{
    int *pFn_2=&numArry[0];
    int *pFn_1=&numArry[1];
    int *pFn=&numArry[2];

    int a,b,n;
    cin>>a>>b>>n;
    a=a%7;
    b=b%7;
    while (a||b||n)
    {
        *pFn_2=1;
        *pFn_1=1;
        for(int i=2;i<n;i++)
        {
            *pFn=(a * (*pFn_1) + b * (*pFn_2))%7;

            int *tmp=pFn;
            pFn=pFn_2;
            pFn_2=pFn_1;
            pFn_1=tmp;
        }

        cout<<*pFn_1<<endl;

        cin>>a>>b>>n;
        a=a%7;
        b=b%7;
    }

    return 0;
}


提交问题:运行超时
自我分析:题目要求n可以是非常大的数据,不能单纯从1到n进行循环,要想缩短时间,只能证明F(n)序列是循环出现的,我想用链表的方式存储F(n),一边算一边寻找何时会出现循环。可是我现在在想,能否从数学上证明,这种递推公式产生的序列一定是循环的序列?

问题:证明可循环,或者使用其他算法。
搜索更多相关主题的帖子: color 
2015-09-28 11:18
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 3楼 jklqwe111
你的代码依然是超时的,我还没仔细看你的代码,稍后再看,你先自己看看有没有可以继续改进的地方。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-10-01 19:13
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
最近有点忙,这个题目我还没好好写,暂时先结贴,等我提交自己代码试过之后再来详细回复各位的讨论。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-10-01 19:14
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
先帖代码,这是我自己用链表写的,已经测试通过了:

程序代码:
#include<iostream>


class Node
{
public:
    Node();
    Node(int numValue,Node *nextNodeValue);
    ~Node();
    void setNum(int numValue){num=numValue;}
    void setNextNode(Node *nextNodeValue){nextNode=nextNodeValue;}
    int getNum(){return num;}
    Node* getNextNode(){return nextNode;}
private:
    int num;
    Node *nextNode;
};

Node::Node()
{
    nextNode=NULL;
    //num=0;
}

Node::Node(int numValue,Node *nextNodeValue)
{
    num=numValue;
    nextNode=nextNodeValue;
}

Node::~Node()
{
}




Node *checkCircle(Node *head,int tmp,Node *pFn_1);
using namespace std;
int main()
{
    int a,b,n;
    cin>>a>>b>>n;

    Node *pFn=new Node();
    Node *pFn_1=new Node(1,pFn);
    Node *pFn_2=new Node(1,pFn_1);
    Node *head=pFn_2;


    
    while (a||b||n)
    {
        pFn_2=head;
        pFn_1=pFn_2->getNextNode();
        pFn=pFn_1->getNextNode();
        pFn_2->setNum(1);
        pFn_1->setNum(1);

        int flag=0;
        for(int i=2;i<n;i++)
        {
            int tmp=(a * (pFn_1->getNum()) + b * (pFn_2->getNum()))%7;

            Node *tmpPNode=checkCircle(head,tmp,pFn_1);

            if(tmpPNode)
            {
                pFn->setNum(tmp);
                pFn->setNextNode(tmpPNode->getNextNode());

                tmpPNode=tmpPNode->getNextNode();
                int count=1;
                while(tmpPNode!=pFn)
                {
                    count++;
                    tmpPNode=tmpPNode->getNextNode();
                }

                //test code这段if根本不可能成立
                if(count==0)
                {
                    cout<<"test message."<<endl;

                    cout<<tmp<<endl;
                    flag=1;
                    break;
                }

                int j=(n-1-i)%count;
                while(j--)
                {
                    pFn=pFn->getNextNode();
                }
                cout<<pFn->getNum()<<endl;
                flag=1;
                break;
            }

            pFn->setNum(tmp);
            pFn->setNextNode(NULL);
            pFn_2=pFn_1;
            pFn_1=pFn;
            pFn=new Node();
            pFn_1->setNextNode(pFn);
        }

        if(flag==0)
        cout<<pFn_1->getNum()<<endl;

        cin>>a>>b>>n;
    }

    return 0;
}

Node *checkCircle(Node *head,int tmp,Node *pFn_1)
{
    Node *tmpHead=head;
    while(tmpHead!=pFn_1)
    {
        if((tmpHead->getNum())==(pFn_1->getNum()))
        {
            Node *tmpP=tmpHead->getNextNode();

            if((tmpP->getNum())==tmp)
            {
                return tmpP;
            }
        }
        tmpHead=tmpHead->getNextNode();
    }

    return NULL;
}

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-10-01 21:05
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 4楼 rjsp
你的代码可以通过,但是这样的思想不太通用,比如说公式里面的7换成别的数的时候,存储空间的大小就要改变是不是?

无论如何,为你代码的精简实用点个赞!


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-10-01 21:16
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 6楼 黑崎一心
嗯,你的回复回答了我的问题。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-10-01 21:17
快速回复:怎么根据递推公式证明会出现循环
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042605 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved