回 帖 发 新 帖 刷新版面

主题:[讨论]十一界的一道读程题,问问到底谁做出来了?

程序超级短。。。因为是递归函数。
var
n:longint;
function g(f:longint):longint;
begin
if k<=1 then g:=k
else g:=(2002* g(k-1) + 2003*g(k-2)) mod 2005;
end;
begin
read(n);
writeln(g(n));
end.
输入2005
问输出多少(答案31),光答案是不够的。。。我想知道里面有什么门道,总之我直接用计算机运行。。。。结果就是。。。。。死机。。。所以各位高手们,你们对读程题有什么技巧没有呢?大家一起分享吧!

回复列表 (共6个回复)

沙发

其实不是死机,而是程序效率太低,输入2005时运算量太大而导致假死。
输入2005后,程序的分支多达近2^2004,这样的运算量即使世界第一的超级计算机都不行。

另外,程序还有一个问题:k怎么凭空出现啦?应该是f吧?

板凳

这道题直接使用循环就可以避免绝大部分的重复计算,从而极大地降低复杂度。

3 楼

那谁读得出来嘛。。。。读循环程序有什么技巧咧?

4 楼

我把它改成循环来做,很快计算出结果31。但要就通过看上面的程序得出结果,恐怕很困难。

5 楼

我菜,咋改呢???

6 楼

// 我不会basic,大概就是下面的样子
var
n:longint;
function g(k:longint):longint;
begin
a = 0
b = 1
for i=2 to 2005
c = (2002* b + 2003*a) mod 2005
a  = b
b = c
next i
g = c
end

begin
read(n);
writeln(g(n));
end

我来回复

您尚未登录,请登录后再回复。点此登录或注册