迪斯蒂法诺位置:★★C语言程序阅读求解!!

来源:百度文库 编辑:高考问答 时间:2024/05/09 12:50:35
这是NOIP2005初赛C提高程序阅读第4题,我肯定我是原封不动地搬到这里来,我用devC++和tubo C编译,得到的答案和官方公布的不一样,而且输入官方输入数据没有任何结果!!

#include <stdio.h>
long g(long k)
{
if(k<=1)return k ;
return(2002*g(k-1)+2003*g(k-2))%2005 ;
}

int main()
{
long n ;
scanf("%ld",&n);
printf("%ld\n",g(n));
getch();
return 0 ;
}

输入:2005
输出:31(官方答案,编译得不到这个结果!!)

还有,这题要怎么做??请越详细越好!!!!如果答得好的话,追加20分!!

哈哈,有意思,在看,不知道能不能想出来哦,我让我机器运行了一下过了1分钟了,还没有结果呢,看来低归好多哦

当我输入5得时候竟然答案是31

感觉2005 和 5有点联系哦

如果分解一下呢?

2002*G(x)+202*G(x-1)+G(x-1)

顺便说下,我输入了个100计算机得CPU使用已经100%并且感觉有10分钟了结果还没有出来。。。

不是没有结果,是计算机还没有算出来。。。

有发现个问题,输入22就算得很慢了。。。什么原理啊。 。。

哎。。。本人比较笨,等待高手来解答了。。。

越看越觉得想数学题。。。在网吧把我想得先记这里,见谅咯

f(x) = (2002*f(x-1)+2003*f(x-2))%2005

感觉可以简化成f(x)=-3*f(x-1)-2*f(x-2)

long 是无符还是有符

哈哈,我目前想得是利用数学得方法把这个式子简化了一下,数学学得不好,只能到这里了

return (2005-(3*g(k-1)+2*g(k-2))%2005);

这样改一下是不是能算得快点。。。

哈哈,我还是楼上得那位mininoah,说不能再修改答案了,所以又注册了一个,这个题做出来了

首先呢。。。我把那个式子简化了一下,简化成

(2005-3*a-2*b)%2005

这样和那个是一个效果,这个纯属数学问题

然后我门不要用递归,这样计算机吃不消啊,我门作个循环,结果是一样得

程序如下

main()
{
int i,a,b,max;
a=2002;
b=1;
clrscr();
for(i=3;i<=2005;i++)
{
max=(2005-3*a-2*b)%2005;
b=a;
a=max;
}
printf("%d",max);
}

别忘了把分给楼上那位,那个还是我。谢谢了。

ncomeback好强啊。
我把你的程序稍微改了一下,我个人感觉好理解一点吧。

#include "stdio.h"

main()
{
int i,a,b,max;
a=1; //a用来表示递归式中的f(x-1),初始为f(1)=1
b=0; //b用来表示递归式中的f(x-2),初始为f(0)=0
for(i=2;i<=2005;i++)
{
max=(-3*a-2*b)%2005;
b=a;
a=max;
}
printf("%d",(2005+max)%2005);
}

程序我看了

太多低归了,所以计算机算的很慢

最好找到规律,5——>31

可能有联系