printf("%2ld",n%10)容易发生错误.
其实前面输出的6 2 5 4 3 7 9都是在digit(n/10,m/10)的内层循环中输出的。后面的9 7 3 4 5 2 6才是跳出内层循环digit(n/10,m/10)在语句printf("%2ld",n%10)中输出的,每次的内层循环digit(n/10,m/10)都有一个语句printf(n/10,m/10)
所以结果就是这样的了。这个问题其实不是很隐蔽
不过要是初学或不细心,哈哈,可就麻烦了!
一、基本知识单项选择题(每小题2分,共20分)1 B 2 B 3 C 4 A 5 C
6 D 7 A 8 B 9 D 10 B
二、阅读程序填空题(每空5分,共60分)备注:有其它正确答案也可以得分
题号 空号
1 1 87 68 43 25
2 2 5 0 4 3 2 1
3 3 b - a
4 s = 400
4 5 a(k * i ) = 0
6 a(i) = 1 或者 a(i)<>0
5 7 0
8 393 - a * 81 - b * 41 - c * 29
9 min <x
6 10 b2 = 0
11 x / y <>a1 / b2
12 EXIT DO
三、程序设计题(共20分)备注:解法不唯一,仅供参考
分析:
这里提供一种解法:
(1)先求出这n堆纸牌张数的平均值avg=(x1+x2+…+xn)/n;
(2)从左边开始向右边处理,即从第1堆开始考虑,依次往右,直至第n堆。具体分为三种情况:
①若x1>avg,则移动一次,移动牌数为x1-avg,把多出的牌加到上x2上,此后继续x2的讨论;
②若x1=avg,不用移动,直接转到x2的讨论;
③若x1<avg,此时向右边移动到xj的条件为:
x1+x2+…+xj-1 <avg * (j-1) 且x1+x2+…+xj ≥ j * avg
即前(j-1)堆纸牌加在一起的总数不足平均数,需要从右边的xj中补充一些
若x1+x2+…+xj=avg*j,则移动j-1次,转入到xj+1的讨论;
若x1+x2+…+xj>avg*j,则移动j次,并由xj移动到xj+1上的牌数为
x1+x2+…+xj - avg*j
源程序:
REM Test3
DIM x(1000)
INPUT "n=", n ' 输入总堆数
avg = 0
FOR i = 1 TO n ' 输入各堆牌的具体张数
INPUT x(i)
avg = avg + x(i)
NEXT i
avg = avg \ n
s = 0: j = 1
DO WHILE j <n
j1 = 1: s1 = x(j)
DO WHILE s1 <j1 * avg ' 从左往右找出需要移出纸牌的堆
j = j + 1
j1 = j1 + 1
s1 = s1 + x(j)
LOOP
IF s1 = j1 * avg THEN ' 前j1堆纸牌刚好可以平摊
s = s + j1 - 1
ELSE ' 前j1堆纸牌平摊后还有多余的纸牌
s = s + j1
x(j + 1) = x(j + 1) + s1 - j1 * avg' 多余纸牌移到第j+1堆
END IF
j = j + 1
LOOP ' j<n
PRINT "move="s
END
程序的运行结果为
测试数据一:
8 (共8堆牌)
6 10 9 12 8 11 7 9 (输入各堆的纸牌数)
move=5 (输出结果)
测试数据二:
4 (共4堆牌)
51 51 51 51 (输入各堆的纸牌数)
move=0 (输出结果)
CCF NOIP2010提高组(C++语言)参考答案与评分标准一、单项选择题(共10题,每题1.5分,共计15分)
1 2 3 4 5 6 7 8 9 10
C A A D B D C B C B
二、不定项选择题(共10题,每题1.5分,共计15分,多选或少选均不得分)
1 2 3 4 5 6 7 8 9 10
ACD AD ABD AC B B D D BCD ABC
三、问题求解(共3题,每题5分,共计15分)
1.yyxy xx yyxy xyx xx xyx
2.12
3.18
四、阅读程序写结果(共4题,每题7分,共计28分)
1.16
2.1 2 3 5 6 7 9 10 14
3.4
4.1 6 9 5 4 8 3 2 7
五、完善程序(第1空2分,其余10空,每空2.5分,共计27分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1.① num <= 2(或num <3 或num == 2)
② go(LEFT_TO_RIGHT)
③ pos[i] == LEFT(或LEFT == pos[i])
④ hour[i] + go(RIGHT_TO_LEFT)(或go(RIGHT_TO_LEFT) + hour[i])
⑤ pos[i] = LEFT
本小题中,LEFT可用true代替,LEFT_TO_RIGHT可用true代替,RIGHT_TO_LEFT可用false代替。
2.① opt[k]
② home[r] = k
③ j = i + i(或j = 2 * i 或j = i * 2)
④ swap(i, j)(或swap(j, i))
⑤ value[i] + heap[1](或heap[1] + value[i])
⑥ i - m
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)