C语言训练题.docx
- 文档编号:7023871
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:27
- 大小:36.61KB
C语言训练题.docx
《C语言训练题.docx》由会员分享,可在线阅读,更多相关《C语言训练题.docx(27页珍藏版)》请在冰豆网上搜索。
C语言训练题
信息学(计算机)奥林匹克训练题(中级部分)
天津师范大学李学武编1997.7.
1.给定等式ABCDE其中每个字母代表一个数字,且不同数字对应不
DFG同字母。
编程求出这些数字并且打出这个数字的
+DFG算术计算竖式。
───────
XYZDE
2.A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
3.打印一个N*N的方阵,N为每边N=15打印出下面图形
字符的个数(3<N<20),要求最TTTTTTTTTTTTTTT
外一层为"T",第二层为"J",从第三层TJJJJJJJJJJJJJT
起每层依次打印数字1,2,3,...TJ11111111111JT
(右图以N为15为例)TJ12222222221JT
TJ12333333321JT
TJ12344444321JT
TJ12345554321JT
TJ12345654321JT
TJ12345554321JT
TJ12344444321JT
TJ12333333321JT
TJ12222222221JT
TJ11111111111JT
TJJJJJJJJJJJJJT
TTTTTTTTTTTTTTT
4.在N行N列的数阵中,数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵。
例如下图就是一个五阶拉丁方阵。
编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。
12345
23451
34512
45123
51234
5.输入一个十进数,将其转换成N进制数(0 6.矩阵中填数.当给出N*N的矩阵,要求用程序填入下列形式的数: ①倒填,例如N=5②蛇形填数③回转填数 ┌─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┐ │25│24│23│22│21││1│3│4│10│11││1│16│15│14│13│ ├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤ │20│19│18│17│16││2│5│9│12│19││2│17│24│23│12│ ├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤ │15│14│13│12│11││6│8│13│18│20││3│18│25│22│11│ ├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤ │10│9│8│7│6││7│14│17│21│24││4│19│20│21│10│ ├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤├─┼─┼─┼─┼─┤ │5│4│3│2│1││15│16│22│23│25││5│6│7│8│9│ └─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┘ 7.读入一行文本,包含若干个单词(以空格间隔,%结尾)。 将其中以A开头的单词与以N结尾的单词,用头尾交换的办法予以置换。 8.输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进制加法运算,再将结果化为十进制数输出。 9.四人玩火柴棍游戏,每一次都是三个人赢,一个人输。 输的人要按赢者手中的火柴数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。 现知道玩过四次后,每人恰好输过一次,而且每人手中都正好有16根火柴。 问此四人做游戏前手中各有多少根火柴? 编程解决此问题。 10.如图1所示,编写程序计算┎┰┰┰┰┰┰┰┰┰┒ 大大小小正方形共有多少? 当最小┠╂╂╂╂╂╂╂╂╂┨ 正方行边长为1时,它们的总面积┠╂╂╂╂╂╂╂╂╂┨ 共为多少? ┠╂╂╂╂╂╂╂╂╂┨ ┠╂╂╂╂╂╂╂╂╂┨ ┠╂╂╂╂╂╂╂╂╂┨ ┠╂╂╂╂╂╂╂╂╂┨ ┠╂╂╂╂╂╂╂╂╂┨ ┠╂╂╂╂╂╂╂╂╂┨ ┠╂╂╂╂╂╂╂╂╂┨ ┖┸┸┸┸┸┸┸┸┸┚ 11.巧排数字。 将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数。 编程打印出所有的排法。 12.下图是一个集装箱仓库,阴影部分表示有集装箱存放不能通过,无阴影处为临时通道。 当有人要从入口处到达出口处时,必须寻找可通过路线,请你找出可完成这个过程的最方便(即用最短路线)到达出口处的路径。 ┎┰┰┰入口┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┒ ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂╂┸┸╂╂╂┨ ┠╂╂╂──╂┸┸╂──╂┰┰╂┰┰╂──╂╂╂╂──╂╂╂┨ ┠╂╂╂──╂┰┰╂┰┰╂╂╂╂╂╂╂──╂┸┸╂──╂╂╂┨ ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂┨ ┠╂╂╂──╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂┨ ┠╂╂╂──╂┰┰╂┰┰╂┰┰╂──╂┰┰╂──╂┰┰╂╂╂┨ ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂──╂╂╂╂──╂╂╂╂╂╂┨ ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂──╂╂╂╂──╂┸┸╂╂╂┨ ┠╂╂╂──╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂╂┰┰╂──╂╂╂┨ ┖┸┸┸──┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸出口┸┸┸┚ 13.有N个硬币(N为偶数)正面朝上排成一排,每次将N-1个硬币翻过来放在原位置,不断地重复上述过程,直到最后全部硬币翻成反面朝上为止。 编程让计算机把翻币的最简过程及翻币次数打印出来(用*代表正面,O代表反面)。 14.有黑白棋子各有N个(分别用*和O代替),按下图方式排列 ***...***OOO...OOO N个黑棋N个白棋 允许将相邻两个棋子互换位置,最后使队形成黑白交替排列,试编程实现该操作。 15.已知6个城市,用c[i,j]表示从i城市到城市j是否有单向的直达汽车 (1=<i〈=6,1〈=j〈=6),c[i,j]=1表示城市i到城市j有单向直达汽车;否则c[i,j]=0.试编制程序,对于给出的城市代号i,打印出从该城市出发乘车(包括转车)可以到达的所有城市。 16.设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。 真伪硬币的区别仅是重量不同,可能重,可能轻。 今要求以天平为工具,用最少的比较次数挑出伪造硬币,并鉴定它是重还是轻。 17.编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度相同。 例如: 输入: THEPRICEOFBREADIS¥125PERPOUND 输出: ABCDDEEEEFHIINOOP¥125PPRRRSTU 并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。 18.在一线性七个格位置的图上有两种不同颜色的棋子A,B.排列如下图所示,中间格的位置为空。 ┎─┰─┰─┰─┰─┰─┰─┒ ┃A┃A┃A┃┃B┃B┃B┃ ┖─┸─┸─┸─┸─┸─┸─┚ 要求将A,B的现行位置交换,形成下图中的排列: ┎─┰─┰─┰─┰─┰─┰─┒ ┃B┃B┃B┃┃A┃A┃A┃ ┖─┸─┸─┸─┸─┸─┸─┚ 移动棋子的条件: (1)每个格中只准放一个棋子。 (2)任意一个棋子均可移动一格放入空格内。 (3)一方的棋子均可跳过另一方的一个棋子进入空格。 (4)任何棋子不得跳跃两个或两个以上棋子(无论颜色同异) (5)任何一个颜色棋子只能向前跳,不准向后跳。 编程完成有关的移动,并且完成具有2N+1个格子的情形.其中两种颜色各有N个棋子,且中间为空格. 19.(背包问题)有N件物品d1,......dN,每件物品重量为W1,...,WN(Wi>0),每件物品价值为V1,......VN(Vi>0)。 用这N件物品的某个子集填空背包,使得所取物品的总重量<=TOTAL,并设法使得背包中物品的价值尽可能高。 20.(N皇后)在国际象棋的棋盘上放置N个皇后,使其不能互相攻击,即任意两个皇后不能处在棋盘的同一行,同一列,同一斜线上,试问共有多少种摆法? 21.请设计一个程序,由计算机把1.. ̄.8的八个自然数填入图中,使得横、竖、对角任何两个相邻的小方格中的两个数是不连续的。 (下图右侧的4个图为禁止的情形). ┌─┐┌─┐┌─┐ │││4││8│ ┌─┼─┼─┐└─┼─┐┌─┼─┘ │││││5││7│ ├─┼─┼─┤└─┘└─┘ ││││┌─┐ └─┼─┼─┘│6│┌─┬─┐ ││├─┤│1│2│ └─┘│7│└─┴─┘ └─┘ 22.在一个4*4的小方格(如图所示)中放置8个*号,使得每行每列放且仅放两个*号。 ┌─┬─┬─┬─┐ │*│*│││ ├─┼─┼─┼─┤ │*││*││ ├─┼─┼─┼─┤ ││*││*│ ├─┼─┼─┼─┤ │││*│*│ └─┴─┴─┴─┘ 求出所有的基本解。 23.(覆盖问题)有边长为N(N为偶数)的正方形,请你用N^2/2个长为2,宽为1的长方形,将它全部覆盖。 编程打印出所有覆盖方法。 如: N=4 ┌─┬──┬─┐┌──┬──┐ ││││1224│││1122 │├──┤│├──┼──┤ ││││1334│││3344 ├─┼──┼─┤├──┼──┤ ││││5668│││5566 │├──┤│├──┼──┤ ││││5778│││7788 └─┴──┴─┘└──┴──┘ 24.某地街道把城市分割成矩形方格,每一方格叫作块,某人从家中出发上班,向东要走M块,向北要走N块,(见图)。 请设计一个程序,由计算机寻找并打印出所有的上班的路径。 单位 ┬┌─┬─┬─┬─┬─┬─┬─┐ │││││││││ │├─┼─┼─┼─┼─┼─┼─┤ ↓││││││││ N├─┼─┼─┼─┼─┼─┼─┤ ↑││││││││ │├─┼─┼─┼─┼─┼─┼─┤ │││││││││ ┴└─┴─┴─┴─┴─┴─┴─┘ 家├─────→M←─────┤ 25.(量水)用存水为M,N升的两个罐子,量出A升水。 26.(八数码问题)8个编有数码1 ̄8的滑牌,能在3*3的井字格中滑动。 井字格中有一格是空格,用0表示,因而空格周围的数码滑牌都可能滑到空格中去. 下图是数码滑牌在井字格中的两种状态: ┎─┬─┬─┒┏━┯━┯━┓ ┃2│8│3┃┃1│2│3┃ ┠─┼─┼─┨┠─┼─┼─┨ ┃1│6│4┃---->┃8│0│4┃ ┠─┼─┼─┨┠─┼─┼─┨ ┃7│0│5┃┃7│6│5┃ ┗━┷━┷━┛┗━┷━┷━┛ 初始状态目标状态 以左图为初始状态,右图为目标状态,请找出从初始状态到目标状态的滑牌移步序列,具体要求: (1)输入初始状态和目标状态的数据; a、分别用两行输入上述两项数据: 例: Entertheinitialstate: 283164705 Enterthefinalstate: 123804765 b、对输入数据应有查错和示错功能; (2)实现从初始状态到目标状态的转换(如不能实现,程序应输出不能实现的提示信息); (3)输出结果,每移动一步都必须在屏幕上显示: a、移动每一步时的序号,最后一步的序号即为移动总步数; b、每一步移动后以3*3表格形式显示状态。 (4)要求能使移动步数尽可能少; 27.给出一个有8个格子的表格,除3个格子外,每个格子中可放入一个数字,这些数字取自自然数1到5,放入格子中的数字不得相同,剩余的3个格子是空格(用O表示)。 图1是一个放数字与空格的特例。 现要求编程实现从初始表格状态变化到目标表格状态。 初始状态和目标状态都是可变的(图1,图2所示的状态仅是一个特例),由键盘输入格子中的数字(0 ̄5)。 移动规则: (1)每一个数字只可以通过虚线移入相邻空格。 如图1中,允许“2”左移入空格,而不能上移进入上面空格。 (2)只允许水平移动或垂直移动,不允许斜移。 (3)移动后,该数字原先所在的格子变成空格。 实现目标: (1)输入初始表格状态和目标表格状态的数据。 ①分别在一行内输入上述两项数据; ②对输入的数据应有查错和报错功能; (2)实现从初始状态到目标状态的转换(如不能实现也应给出必要的说明)。 (3)显示结果: 每移动一步都应在屏幕上有如下信息: ①显示每一步移动的序号。 所以最后一步的序号就是移动的总步数。 ②显示每一步移动前后的表格状态。 (4)以最少的移动步数达到目标。 ┎─┰─┰─┒┎─┰─┰─┒ ┃3┃4┃0┃┃0┃0┃0┃ ┎─╂─╂╂─╂─┒┎─╂─╂╂─╂─┒ ┃01025┃┃12345┃ ┖─┸─┸─┸─┸─┚┖─┸─┸─┸─┸─┚ 图10-1图10-2 初始状态A目标状态B 28.n枚银币C1,C2,...,Cn,其中有一块不合格,不合格的银币比正常的要重。 现用一天平找出不合格的一块,要求在最坏的情况下,用的天平次数最少。 29.把一段文章按要求排版。 文章的输入方式为: 由键盘输入一段以回车符结束的文章(最大长度2000个字符)。 排版时以单词为基本单位。 单词由不含空格的任意字符组成,是长度小于20个字符的串。 空格符是分隔单词的唯一字符,在输入时连续的空格符在处理时应先化简为单个空格符。 在排版前应先输入,排版后每行的字符数为N,排版后将整理好的文章按行输出。 输出时不能将一个完整的单词截断,并要求输出的总行数最小。 将每个不足N个字符的行用空格补足,填充空格符的方式有以下三种。 1)将填充的空格符置于每行的末尾,并要求每行的起始为单词。 2)将填充的空格符置于每行的开始,并要求每行的末尾为单词。 3)将填充的空格符平均分配在每行中,并保证行的起始和末尾均为单词。 30.某机要部门安装了电子锁。 M个工作人员每人发一张磁卡,卡上有开锁的密码特征。 为了确保安全,规定至少要有N个人同时使用各自的磁卡才能将锁打开。 问电子锁上至少要有多少种特征? 每个人的磁卡上至少要有多少特征? 如果特征的编号以小写英文字母表示,将每个人的磁卡的特征编号打印出来,要求输出的电子锁 的总特征数最少。 设3<=M<=7,1<=N<=4,M与N由键盘输入,工作人员编号用1#,2#,...表示. 31.甲乙两人从24枚棋子中轮流取子,甲先取,规定每次所取的枚数不能多于上 一个人所取的枚数,也不可不取。 (1)甲第一次取多少枚才能保证甲取得最后一枚,当然,他也不能第一次就把 所有棋子都取走。 (2)讨论棋子总数N(一定是偶数)从6到30的各种情况。 讨论内容包括: 对各个N,是否存在一个小于N的枚数M,甲第一次取M枚后就能保证甲如果策略 正确,一定能取到最后一枚棋子。 32.(走棋)一个4*4的方阵如图。 有一个小卒从上往下走。 走至格子1后就 不能走动,走至0后,若下方为1,则向左或向右走,下方为0,则向下走。 求所 有走法。 ┌─┬─┬─┬─┐ │1│0│0│0│ ├─┼─┼─┼─┤ │0│0│1│0│ ├─┼─┼─┼─┤ │0│1│0│0│ ├─┼─┼─┼─┤ │1│0│0│0│ └─┴─┴─┴─┘ 33.(野人与传教士)设有三个传教士和三个野人来到河边,打算乘一只船从右 岸渡到左岸去。 该船最大负载能力为两人,在任何时候,如果野人人数超过传教士 人数,那么野人就会把传教士吃掉。 他们怎样才能用这条船安全地把所有人都渡过 河去呢? 34.(取棋子)设有N颗棋子,由人和计算机轮流从中取走若干颗。 每方每次最 多取K颗,最少取1颗(K值不能超过总数的一半,也不能小于1)。 试编写一程 序使计算机有较多的获胜机会。 屏幕输入提示: (1)输入竞赛规则: A.取最后一颗棋子的那一方为败. B.取最后一颗棋子的那一方为胜. (2)总共有多少颗棋子? (3)一次最多取几颗? (4)谁先取? (5)每个回合都应显示: A.你取几颗? B.我取走......颗,还剩......颗. (6)竞赛过程中发生违例时,打印出: 竞赛无法进行下去! (7)竞赛结束后打印: Iwin! (我胜! )或Youwin! (你胜! )。 35.(Grundy博弈)在两位选手面前放着一堆铜币。 第一位选手把原堆分成不相 等的两堆。 然后每个选手轮流地这样做,即当轮到某一方分时,他把已被分开的任 一堆再分成不相等的两堆。 博弈这样一直进行下去,直到每一堆都只剩下一个或两 个铜币为止,这时博弈结束。 规定首先遇到这种情况的选手为输。 36.猴子选大王: ①N只猴子站成一行,每隔M只从头到尾报数,反复进行,报过数的退出,打 印每次退出的猴子的编号,直到剩下一只为止。 ②N只猴子站成一行,每M只报数。 先从头到尾,报到尾后,再返回从尾到头 报数,打印每次方向及过程,直到剩下二只时,以排到后面的(指报数方向)为大王。 ③N只猴子围成一圈,从第P个开始,每隔M只报数,打印每次过程,只剩下 一个时为大王。 37.已知N个正整数满足K1+K2+...+Kn=M。 求一组最佳的分解,使得 K1*K2*....*Kn为最大。 例如: N=2时,给定K1+K2=6,当K1=3,K2=3时,K1*K2=9为最大 38.有一集合中有N个元素,每个元素均为自然数。 给定一个total(假设每个 元素值均小于total),求满足条件的所有子集,子集中各元素之和应等于total。 39.一个集合满足如下条件: (1)1是集合的元素; (2)若P是集合的元素,则2*P+1,4*P+5也是集合的元素。 求: 此集合中最小的K个元素。 ③对ABC作全排列而得的六个三位数之和为2886。 40.一个整型变量只能用来存贮较小的N! 的值,当N较大时,可将阶乘值中的 每一个数字放在一个一维数组的一个元素中。 使用这方法,打印: ①N! 的值; ②N! -M! (M>N); ③N! +M! 41.(合并链表)已知两个链表AN={a1,a2,...an},BN={b1,b2,...bm},将其合并 为一个链表CN={a1,b1,a2,b2,...} 42.(算术表达式求值)输入一个由数字、+,-,*,/及括号组成的算术表达式, 求其值。 43.对于次数很高,但项目很少的多项式,可用链表来表示。 例如: X^1000-76*X^76+3*X^3-7可表示为 ┌─┬──┬─┐┌──┬─┬─┐┌─┬─┬─┐┌─┬─┬──┐ │1│1000│┼→│-76│78│┼→│3│3│┼→│-7│0│NIL│ └─┴──┴─┘└──┴─┴─┘└─┴─┴─┘└─┴─┴──┘ 在此方式下,编程完成两个多项式的加法与乘法。 44.(一元多项式加法)实现两个整系数一元多项式的加法。 例如,对于多项式 5*X^6+4*X^3-7*X^4+1与多项式50*X^2+4*X,运算结果为: 5*X^6-7*X^4+4*X^3+50*X^2+4*X+1。 程序要求: 键盘输入多项式的各项系数及指数,每项系数及指数为一组数据(系 数及指数之一可为零),以'0,0'结束一个多项式的输入,结果按降幂排列,同类 项要合并(指数最大不超过30)。 上例第一式的输入为: 5,6 4,3 -7,4 1,0 0,0 输出结果应为: 5*x^6-7*x^4+4*x^3+50*x^2+4*x+1. 45.(数列的最小代价)给定一个正整数序列,例如: 4,1,2,3,不改变数的位置把 它们相加,并且由括号来标记每一次加法所得到的和。 例如: ((4+1)+(2+3))= ((5)+(5))=10.除去原数4、1、2、3之外,其余都为中间结果,如: 5,5,10,将中 间结果相加,得到: 5+5+10=20,数20称为此数列的一个代价。 对于另一种算法: (4+((1+2)+3))=(4+((3+3))=(4+(6))=10,得到数列的另一个代价为: 3+6+10=19. 若给出N个数的数列,求出此数列的最小代价。 46.设有一个字符串,长度小于100,且全部以英文字母组成。 对字串中的每个字 母可用0,1,2三个数字进行编码,且数字可以重复使用。 程序要求: (1)输入字符串,并能判断输入是否有错; (2)输出对应的编码表及码长,要求字串的编码总长度为最短; (3)根据上述编码表,给出一些编码,然后求出其原字符串。 例如: 输入的字符为: ABCBAAADDEF 其对应的编码表为: A: 2B: 10 C: 11D: 12 E: 00F: O1 对应的编码为: 210111022212120001总码长为: 18 根据该编码,给出编码: 010001121110222则输出字串: FEF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 训练