level 1
program tj1005;var k,n:integer;function a(n:integer):integer;begin if n=1 then a:=1; if n=4 then a:=2; if n>4 then a:=a(n-1)+a(n-3);end;begin while not seekeof (input) do begin readln(n); k:=a(n); writeln(k); endend. 还是超时 拜托减一下
2005年04月12日 07点04分
1
level 2
Problem设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛? Input本题有多组数据。每组数据只有一个整数N,独占一行。(1≤N≤50) Output对每组数据,输出一个整数(独占一行)表示第N年时母牛的数量 Sample Input14520Sample Output123872
2005年04月21日 02点04分
3
level 2
可以用数组保存之前的结果,减少重复计算。var i,n:integer; a:array [1..50] of longint;begin a[1]:=1;a[2]:=1;a[3]:=1;a[4]:=2; for i:=5 to 50 do a[i]:=a[i-1]+a[i-3]; while not eof(input) do begin readln(n); writeln(a[n]); end;end.
2005年04月21日 02点04分
4
level 0
用函数来做很直观,但是程序上的简短不代表程序能快速地得到结果.用函数来做会照成堆栈过多,占用大量内存空间,假如变量太大,会照成溢出.我的思路是将其改为非递归形式,不用函数也不用过程.直接用while,设一个变量a来存放有生育能力的母牛的数目,数组b[0..4]分别存尚未有生育能力的不同年龄段的小母牛数目.然后模拟每年的生育情况:i := 1;b0:=1;a:=0;while i<=n dobegina:=b4+a;b4:=b3;b3:=b2;b2:=b1;b1:=b0;i:=i+1;end;write(a+b0+b1+b2+b3+b4);大概就是这个思路了,没上机调试过,不知程序有什么bug.
2008年02月27日 02点02分
8
level 0
楼上的都...很无语fib是有分治法得到的O(logn)算法的,还有公式的O(1)的不过公式的不精确.有兴趣的可以看看这里http://hi.baidu.com/leokan面OI栏目下的某一贴
2008年03月01日 04点03分
9
level 1
这个没有写错。这个a是函数名。
在某些编译器中,给a赋值,就是给函数赋值并返回。
2011年05月01日 02点05分
14
level 1
function a(n:integer):integer;
begin
if n=1 then a:=1;
if n=4 then a:=2;
if n>4 then a:=a(n-1)+a(n-3);
end;
楼主的代码里,并没有判断n=2或n=3时的结果,也就是说,当n=2,3时,函数a返回的是一个未知数。溢了的地方就在这里了。
你只要把它改成
function a(n:integer):integer;
begin
if n<4 then a:=1;
if n=4 then a:=2;
if n>4 then a:=a(n-1)+a(n-3);
end;
结果已经测试,是
正确的
,也没出现溢出。
2011年05月01日 03点05分
15
level 1
楼上的,你有没有学过PASCAL?
我说的是给函数名赋名,没有说给变量赋值。
你自己不给变量赋值,不错才怪。
2011年05月03日 04点05分
17
level 1
我说的是给函数名赋值,没有说给变量赋值。
给函数名赋值,就是结束函数并赋值的意思。
2011年05月03日 08点05分
18
level 1
注意:k:=a(n),不是k:=a[n].
一个是函数,一个是数组,如果是数组,肯定要先赋值。
2011年05月03日 08点05分
19