标题:【求助】c语言,新手,我又 RE 又 MLE 又 TLE 了,不知道怎么办了,帮忙看看 ...
只看楼主
xuanyuxian
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-7-17
得分:0 
以下是引用vvvcuu在2014-7-17 10:11:11的发言:

当A和B给定以后,f(n)将会按一定的规律出现,呈现一定的循环.因此,只需要考虑A,B即可.
设定一个数组,比如a[1000], 依次计算从1到n的f(n),令i表示循环参照量.把每次计算的f(i),依次存入数组a[]中, 设置另一个变量k,k=i/2. 依次比较a[0]到a[k-1]和a[k]到a的值(k=2;k<=i;k+=2),这个地方比较浪费时间,如果相等,跳出循环,可能需要goto,记录下此时的i值,然后计算n%i, 最后f(n)=a[n%i+k].
 
简单的描述了下算法, 还没写具体的代码, 一会儿写一下看看能行不.
 
初步估计,只要比较连续的7个数字相等就可以停止计算了.  亲测对于不同的a,b,当n=50的时候,最大的循环尽管到达30多,但并没有出现连续的7个数字和后面数字相等的情况.
 
个人认为,存入数组然后取出来直接用要比递归快得多. 递归只适合运算规模不大的情况下. 就这个题来说,递归1个亿的运算规模一般的计算机都需要很长时间的.
我自己测试的类似你的第一个的代码的程序, 循环依次输出50个数字的情况下就接近一分钟了.
2014-07-17 17:09
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
得分:2 
你好,我想知道你学长的算法.
个人尝试写出具体的实现代码,结果在数组元素的相等判断那里卡住了,不知道该怎么判断数组中那些元素都相等.
而且他还说a[]的长度可以由M的长度推出来,因为它是一个等差数列的求和,就是a1*n+n(n-1)/2这个高中学的,可以得出a的大小大概是M的开方。


请问:M是什么?   如何确定a[]是等差数列的?,   那些元素mod 7后, 并没有出现明显的规律.

代码测试环境:  WinXP+C-Free5.0.
2014-07-17 18:06
xuanyuxian
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-7-17
得分:0 
回复 12 楼 vvvcuu
不对不对不对,我混淆了两个题了,我说的那个(就是你截了图的那个)是另外一道题,是一个数列的。我刷题刷昏脑袋了。


学长的意思是:假设我输入了a=1,b=2,那么我们会有f(1)=1,f(2)=1,f(3)=3,f(4)=5,f(5)=4,f(6)=0,f(7)=1,f(8)=1,从这里开始,就是不断地循环这几个f的值了,当a,b输入是其他的值也会这样,然后。。。。。我现在正在写这个代码
2014-07-17 19:35
xuanyuxian
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-7-17
得分:0 
回复 12 楼 vvvcuu
你不是这个意思吗?我看到了你的这一句“当A和B给定以后,f(n)将会按一定的规律出现,呈现一定的循环.因此,只需要考虑A,B即可.”就以为你跟学长讲的是一样的了。。。。
2014-07-17 19:39
xuanyuxian
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-7-17
得分:0 
回复 12 楼 vvvcuu
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int a,b,n,f[100000],i,p;
    while(~scanf("%d%d%d",&a,&b,&n)&&(a+b+n))
    {
        f[1]=1;
        f[2]=1;
        for(i=3;i<=n;i++)
        {
            f[i]=(f[i-1]*a+f[i-2]*b)%7;
            if(f[i]==1&&f[i-1]==1)
               {
                   p=i-2;
                   n=n%p;
                   break;
               }
        }
       printf("%d\n",f[n]);
    }
return 0;
}


这是我后来写的我感觉我是对的,我用很多组数据测过,但就是AC不了,不知道哪里出问题了
2014-07-17 21:01
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
得分:6 
程序代码:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int a,b,n,f[100000],i,p;  //这里感觉100000太大了,1000应该就差不多了.
    int s;                    //多设置个变量,下面有用
    //while(~scanf("%d%d%d",&a,&b,&n)&&(a+b+n))   //这种用法没怎么见过,也没这么用过,还是按部就班来吧
    while(a||b||n)
    {
        printf("Please input three numbers,like 1,2,3:\n");  //给个提示,来点交互.
        scanf("%d,%d,%d",&a,&b,&n);
        f[1]=1;
        f[2]=1;
        for(i=3;i<=n;i++)
        {
            f[i]=(f[i-1]*a+f[i-2]*b)%7;
            if(f[i]==1&&f[i-1]==1)
               {
                   p=i-2;
                   //n=n%p;     n%p只能得到比p小的数字,如果n%p==0,是没法输出结果的,因为f[0]你没有赋值使用.
                   s=n%p;       //用另外的变量吧,还是不改动n好点.  
                   if(s==0)
                   s=p;         
                   break;
               }
        }
       printf("%d\n",f[n]);
    }
return 0;
}


这样的话,应该可以了.

代码测试环境:  WinXP+C-Free5.0.
2014-07-17 23:04
xuanyuxian
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-7-17
得分:0 
回复 16 楼 vvvcuu
while(~scanf("%d%d%d",&a,&b,&n)&&(a+b+n)这个是多组数据输入的的意思,并且a+b+c不等于0,你应该要看一下多组数据输入的方式,百度知道里面有一个回答就很详细。

同学AC了,就是你说的那个n%p是否等于0的问题,要分两种情况。


谢了,交流了这么多
2014-07-18 18:48
xuanyuxian
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-7-17
得分:0 
回复 16 楼 vvvcuu
交流了这么多很开心
2014-07-18 18:49
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
凑个热闹。
程序代码:
#include <stdio.h>

int cal(int a, int b, int n)
{
    int f[51] = {0, 1, 1}, i, j = 1;
    for(i = 3; j <= 1; i++)
    for(f[i] = (f[i - 1] * a + f[i - 2] * b) % 7, j = i - 1;
        j > 1 && (f[j] != f[i] || f[j - 1] != f[i - 1]);
        j--);
    return n <= --i ? f[n] : f[j + (n - j) % (i - j)];
}

int main()
{
    int a, b, n;
    while(scanf("%d%d%d", &a, &b, &n), a + b + n)
        printf("%d\n", cal(a, b, n));
    return 0;
}

重剑无锋,大巧不工
2014-07-18 21:00
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
得分:0 
回复 19 楼 beyondyf
杨大哥的代码看起来就是让人舒服,思维很严谨。
这种程度得努力很多年才能追上啊,现在只能望尘莫及

思考赐予新生,时间在于定义
2014-07-19 08:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-434117-1-1.html




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

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