主题:yt
kuuga
[专家分:190] 发布于 2005-10-11 19:43:00
题目描述:
一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚……直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。m为2时,翻3次即可;m为3时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可;…;m为30时,翻899次即可;…
输 入:
仅有的一个数字是这摞硬币的枚数m,0<m<1000。
输 出:
为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。
输入样例:
30
输出样例:
899
回复列表 (共10个回复)
沙发
moz [专家分:37620] 发布于 2005-10-11 20:58:00
数学的办法我还没想到,
既然没想到,就用QB直接来做吧,
我用1000来代入,
用了161秒算出是308000,不知道对不对?
defint a-z
input m
dim s(m)
do
k&=k&+1
j=j+1
if j>m then j=1
for i=1 to j
s(i)=1-s(i)
next
for i=1 to (j\2)
swap s(i),s(j-i+1)
next
for i=1 to m
if s(i)>0 then exit for
next
loop until i>m
print k&
板凳
zqnhlm [专家分:780] 发布于 2005-10-13 21:17:00
DIM n AS INTEGER
DIM m AS INTEGER
DIM count AS INTEGER
DIM number AS INTEGER
DIM j AS INTEGER
j = 1
count = 0
INPUT "ying bi shu? ", n
DIM a(n) AS INTEGER
DIM b(n) AS INTEGER
FOR i = 1 TO n
a(i) = 1
NEXT i
FOR i = 1 TO n
b(i) = i
NEXT
DO WHILE (1)
number = 0
m = 0
FOR i = 1 TO (1 + j) \ 2
t = b(i)
b(i) = b(j - i + 1)
b(j - i + 1) = t
NEXT i
FOR i = 1 TO j
a(b(i)) = a(b(i)) * (-1)
NEXT i
count = count + 1
IF j = n THEN
j = 1
ELSE
j = j + 1
END IF
FOR i = 1 TO n
IF a(i) = 1 THEN number = number + 1
NEXT i
IF number = n THEN EXIT DO
LOOP
PRINT n, count
END
3 楼
moz [专家分:37620] 发布于 2005-10-13 21:39:00
才给我10分?
(吐血而亡)
zqnhlm 的方法基本上是和我一致的
看得出来你的脑袋也挺大的,差不多能赶上我了
只是有一个地方不够完善
DIM count AS [color=FF00FF]INTEGER[/color]
应该改成[color=FF00FF]LONG[/color]才能符合题意.
而且你的速度跟我的相比有一定差距喔.
4 楼
zqnhlm [专家分:780] 发布于 2005-10-15 22:14:00
哈哈不好意思那是我们老师的
5 楼
moz [专家分:37620] 发布于 2005-10-16 01:23:00
你是说楼主是你老师
还是说程序是你老师编的
6 楼
zqnhlm [专家分:780] 发布于 2005-10-16 09:12:00
程序是老师编的
7 楼
moz [专家分:37620] 发布于 2005-10-16 11:44:00
这样的话
你和你的老师都不能称赞了
8 楼
zqnhlm [专家分:780] 发布于 2005-10-21 20:18:00
哦
9 楼
moz [专家分:37620] 发布于 2005-10-21 20:29:00
每贴给10分?
还欠我10分.
10 楼
zqnhlm [专家分:780] 发布于 2005-10-22 21:06:00
死心眼啊
我来回复