程序设计大赛试题

第一部分预赛题目

试题1.“数学黑洞”:任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,最终会出现一个神秘的数,请编程输出这个神秘的数。

试题2.将数字1、2、3、4、5、6填入一个2行3列的表格中,要使得每一列右边的数字比左边的数字大,每一行下面的数字比上面的数字大。请编写程序求出按此要求可有几种填写方法。

试题3.编写成绩排序程序。按学生的序号输入学生的成绩,按照分数由高到低的顺序输出学生的名次,该项名次的分数、相同名次的人数和学号;同名次的学号输出在同一行中,一行最多输出10个学号。

试题4.输入一个字符串,内有数字和非数字字符,如:gs 423cd156 7896>?df12345,将其中连续的数字作为一个整数,依次存放到一数组a中,例如:423放在a[0],156放在a[1],…。统计共有多少个整数,并输出这些数。

试题5.在磁盘上建立一文件stud用于存放学生数据(含学号、姓名、数学、语文、英语、平均成绩、总成绩),从键盘输入6个学生的学号、姓名及三门课的成绩,计算出总分和平均分存入文件stud,并显示该文件的内容。编写程序完成以上功能。

试题6:某工业自动控制系统中,需通过PC机检测管道的流量,由于线路传输信号不稳定,采集的数据有一定的误差。PC机上采集到的电压信号通过如下公式可计算出管道的流量:
L=(V-V0)*K
其中L为流量,V为PC机上测到的电压值,V0为传输电路的基准电压,K为比例因子。
现场测得实验数据已保存在i:\tube.txt,请确定算法并编程计算此系统上基准电压(V0)和比例因子(K)的最佳值,使得系统计算出来的流量与实际误差最小。
要求:1、运行的测试数据直接从i:\tube.txt文件中读取;
2、不可改变i:\tube.txt文件中任何内容。
附件:i:\tube.txt
试题7:用某行业的产品质量化验中使用“四舍六入五留双”的方法统计数据。该方法的数据修约规则如下:
① 当尾数小于或等于4时,直接将尾数舍去;
② 当尾数大于或等于6时,将尾数舍去并向前一位进位;
③ 当尾数为5,而尾数后面的数字均为0时,应看尾数“5”的前一位:若前一位数字此时为奇数,就应向前进一位;若前一位数字此时为偶数,则应将尾数舍去。
④ 当尾数为5,而尾数“5”的后面还有任何不是0的数字时,无论前一位在此时为奇数还是偶数,也无论“5”后面不为0的数字在哪一位上,都应向前进一位。
例如,下列各数用“四舍六入法”保留两位有效数字。
8.3300≈8.3 8.3600≈8.4 8.3570

≈8.4 8.3500≈8.4 8.2500≈8.2
现有某企业化验室对某产品质量进行多次检验,其检验的原始数据保存i:\quality.txt文件中,但其中的“平均值”、“合格率”和“标准偏差”等项目尚未统计。请编程按照上述“四舍六入五留双”的统计方法对表中尚未统计的项目进行统计。

要求:1、运行的测试数据直接从i:\quality.txt文件中读取,不可改变i:\quality.txt文件中任何内容。
2、程序中的“四舍六入五留双”统计方法应自己编制代码完成,不可用系统提供的函数或控件;
4、要统计的“平均值”和“标准偏差”结果要求保留小数点后3位,“合格率”保留小数点后2位;

附:1、质量控制标准(大于以下标准为质量不合格)
成分 CaO Fe2O3 煤掺入量 水分
含量标准 0.220 0.030 0.230 0.015
2、标准偏差计算公式为:


试题8:某汽车越野赛按不同型号分组:A组--小汽车、B组--老爷车、C组--摩托车。比赛当天完成,所有的比赛车起点相同且走同一线路,总路程约300公里,出发时间为:A组—9:00、B组—9:30、C组—10:00,文件i:\match.txt为赛道终点的裁判记录各赛车抵达的时间。请根据此成绩编程输出各组赛车中速度最快的前5名的车号和用时。
要求:运行的测试数据直接从i:\ match.txt文件中读取,不可改变i:\ match.txt文件中任何内容。

试题9:旅行路线选择:某人欲利用假期时间旅游,从桂林市出发游遍三亚(SanYa)、武夷山(WuYiShan)、杭州(HangZhou)、九寨沟(JiuZhaiGou)、吐鲁番(TuLuFan)、丽江(LiJiang)等各城市,各城市之间的旅费(已含路费、住宿、景点等全部费用)如i:\ TraveFee.txt文件中所示,请编程编排旅游选择的最佳线路,使之旅费最少。
要求:1、各城市间的旅费表数据由输入文件i:\ TraveFee.txt提供,不可改变i:\ match.txt文件中任何内容。
2、输出的旅游线路表示如下形式:
The route path is:GuiLin->SanYa->……->GuiLin {最少旅费城市路径}
Total of traveling expense: 6200 {最少旅费数}
试题10:输入一字符串,编写程序实现如下功能:
1)将字符串的内容颠倒过来并进行输出。如:“abc”改为“cba”。
2)统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开。
3)找出字符串中所有相同的字母,输出并显示其出现次数。

试题11:设有如下结构类型说明:
struct stud
{ char num[5],
char name[10] ;
int s[4] ;
double ave ;
}
请编写:
1)从键盘输入至少3名学生的学号、姓名和四项成绩,然后计算出平均分并放在结构体对应的域中。按学号从小到大的顺序保存到文件file.dat中。
2)根据学生姓名

查找并输出该学生的平均分。
3)从file.dat中读出学生的有关信息,根据每人的平均分得出其相应的等级。输出其姓名及等级。(<60 D档,60~70 C档, 70~85 B档, >85 A档 )

试题12:调用随机函数为5╳4的矩阵置100以内的整数。调用随机函数步骤如下:
#include “stdlib.h”

x=rand()%100 /*产生0到100的随机数*/
编写程序,实现如下功能:
1)求出每行元素之和的平均值,并将平均值最大的一行元素与平均值最小的一行元素对调。输出该矩阵。
2)逆置该矩阵并输出。即将第一列的元素放在第一行上、第二列的元素放在第二行上、其它依次类推。
3)找出每一行最小的数,输出其所在的列号。

试题13:输入一行数字字符(用回车结束),每个数字字符的前后都有空格,编写程序实现如下功能。
1)按大小顺序输出每个数字字符及与之对应的ASCII代码值,每行输出三对。
2)将这一行中的数字转换成一个整数,例如:若输入2 4 8 3 ,则输出2483
3)将该数字字符串中的所有偶数数字字符删除。

试题14:输入任意整数,编程实现如下功能。
1)编写函数,验证任意偶数为两个素数之和并输出这两个素数。
2)编写函数,判断整数x是否是同构数,所谓“同构数”是指,它出现在它的平方数的右边。例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数。x的值由主函数从键盘读入,要求不大于100。
3)编写函数,将输入的10进制整数转化为它所对应的二进制数。

试题一
试题15::编写一个求解一元二次方程的解的程序。用户只要给出一元二次方程:
aX2+bX+c=0的三个系数a,b,c,便可以求出它的根。
1.程序运行时,给出三个命令选项提示,分别是:输入方程系数,退出程序,清屏。用户按相应键可执行其中的一个命令,执行完毕后又返回初始状态;
2.当选择输入方程系数选项后,提示用户输入三个系数a,b,c当用户输入完成后,回车即可求出方程的根(可能为实根或虚根),之后返回命令提示状态;
3.当选择退出程序选项后,提示是否真的退出,若真的要退出,程序才退出,否则,程序不自动退出。
4.选择清屏选项后,返回到初始时的命令选择选择状态。
试题16:写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环 节,要将其用括号括起来。例如:1/3=.00000...表示为.(3),又如41/333=.123123123...表示为.(123)。
一些转化的例子:
1/3=.(3)
22/5=4.4
1/7=.(142857)
3/8=.375
45/46=.803(571428)
试题17:魔方阵就是一种特殊的方阵(这里只考虑奇数阶魔方阵):它的

行,列,对角线,上的数字之和都要相等,且方阵中的每一个数字都不相等,且数字的范围都在1到n*n之间.
如3×3魔方阵为:
8 1 6
3 5 7
4 9 2




1.程序运行时,给出两个命令选项:产生魔方阵或退出程序或清屏,如下所示:







2.当用户按M键,提示用户输入魔方阵的阶数N(N为奇数),按回车便输出魔方阵,如下所示:





3.产生魔方阵后又返回初始命令选择状态,用户按Q退出,按M继续产生魔方阵
4.提示:
奇数阶魔方阵的生成方法如下:
(1) 第一个位置在第一行正中;
(2) 新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,如超出右边界则新位置取应选行的最左一个位置;
(3) 若最近一个插入元素为N的整倍数,则选下面一行同列上的位置为新位置。

第二部分复赛题目
试题1:下面是一个乘法竖式,如果用我们给定的那几个数字来取代*(第一位不能为0),可以使式子成立的话,我们就叫这个式子牛式。
* * *
x * *
----------
* * *
* * *
----------
* * * *
请编写程序找出所有的牛式。
要求:输入可以指定数字个数和及其数字,输出为符合条件的牛式。
例如,输入为:
5
2 3 4 6 8
输出为:
2 2 2
x 2 2
---------
4 4 4
4 4 4
----------
4 8 8 4
试题2::坐飞机旅行费用不小。购买飞机票的费用不一定直接与旅行的总路程相关。为了节省路费,旅客通常会制定最佳的旅游路线,进而购买相关机票。然而航空公司已经发现这一现象,通常要求一张机票所涉及的旅行路线是按固定顺序排列的。例如,假如你有一张机票,它规定了路线:从城市1到城市2,再到城市3。你就不能直接从城市2到城市3,你必须从城市1开始,而且,你不能从城市1到城市2,然后买别的机票飞到别的地方而后返回城市2,再到城市3。考虑以下实例:
假定允许你买三种机票:
机票1:城市1----》城市3-----》城市4, 225美元
机票2:城市1----》城市2 ,200美元
机票3:城市2-----》城市3,50美元
现在假定你想从城市1旅行到城市3,有两种购票方式:
方式1:购买机票1,只使用该票涉及到的前半部分旅程。耗费225美元;
方式2:购买机票2和机票3,耗费250美元
方式1是比较经济的购票方式。
现给定一组可购买的机票,和一条或多条旅行路线,为了使旅行费用最低,你必须确定怎样购买机票。每一条旅行路线都是可能的。
1.输入:
第1行有一个数,表示票的种数NT,紧接着的NT行分别是各种票的具体说明,分别是编号 ,票价,旅行路线,最后一行是

旅客要旅行的路线。例如,输入文件中的数据格式可能如下:
3
1 225 1 3 4
2 200 1 2
3 50 2 3
1 3
这里的第1行表示有3种票;第2到第4行(共3行)用于说明该票的信息,每行的第1个数表示票的编号(从1开始,递增,这里的三种票编号分别为1,2,3),第2个数表示该票的票价,其余的数表示该票的所覆盖的城市编号(例如上面的机票1所旅行的城市分别为城市1,城市3,城市4;最后一行用于指定旅客的旅行路线(这里为:城市1---》城市3)
2.输出
输入的测试数据所对应的各种购票方式(每一种单独至于一行)。其中第1行应为最省钱的购票方式:
例如,上面的方案对应如下:
1,225
2 3,250
注:逗号前面的数表示票的编号,若有多种票,则其间用空格分隔开来;逗号后面表示该购票方式所需金额。


试题3:玩彩票
我市发行一套福利彩票。彩票上写有1到M这M个自然数。彩民可以在这M个数中任意选取N个不同的数打圈。每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同。

每次抽奖将抽出两个自然数X和Y。如果某人拿到的彩票上,所选N个自然数的倒数和,恰好等于X/Y,则他将获得一个纪念品。

已知抽奖结果X和Y。现在的问题是,必须准备多少纪念品,才能保证支付所有获奖者的奖品。


试题4:捉鬼大师
世界上有鬼吗?如果有,那就一定有捉鬼大师。但捉鬼大师们法力有限,他们只能消灭位于他们东南面的鬼。也就是说,如果把捉鬼大师所在位置视为原点,那么他们只能消灭第四象限的鬼怪(位于x正半轴和y负半轴上的鬼也会被消灭)。
现在给出一些鬼和坐标和一些捉鬼大师的坐标,请问有多少个鬼不会被消灭?
输入:
第一行,给出两个数字g,b对应予鬼的个数和捉鬼大师的个数。接下来的g行,每行两个整数,是每个鬼的坐标(之间有一个空各分开),在接下来得b行,每行两个整数,是每个捉鬼大师的坐标(之间有一个空各分开),不会有重复的鬼或重复的捉鬼大师出现。
输出:
无法被消灭的鬼的坐标x,y,之间用一个空格分开。注意这些坐标输出顺序必须 按照y值得绛序排列,当y相等时,则按照x的绛序排列。
样例:
输入:
3 2
0 5
1 2
2 3
1 4
-2 3
输出:
0 5
建议:
int main()
{
int g,b;
scanf("%d %d",&g,&b);
for(int i=0;i//读入鬼坐标
for(int i=0;i//读入捉鬼大师坐标
//你的代码
return 0;
}

试题5:擦桌子
1.Stan是个懒惰的孩子,他做任何事总希望能找到既省力又快捷的方法。Stan的父母开着一家餐馆。餐馆有n*n张桌子,排放成n*n的方阵,每个桌子

都有一个坐标,左上角的桌子的坐标为(1,1),其右面的桌子坐标为(1,2),其下面的桌子的坐标为(2,1).....最右下角桌子的坐标为(n,n)。Stan每天都要帮助他父母擦桌子,他当然不打算自己一个人干,所以他召唤出了一只小精灵。
小精灵只有一项技能:当Stan擦了坐标为(x,y)的桌子时,小精灵会自动帮他把所有坐标为(kx,ky)(k=2,3,.........,,使得kx<=n,且ky<=n)的这些桌子擦干净。现在,Stan想知道把桌子全部擦干净,对于n*n张桌子,他最少需要擦哪些桌子,这些桌子一共有多少张?。
比如n=4时,Stan只要擦(1,1), (1,2), (1,3), (1,4), (2,1), (2,3), (3,1), (3,2), (3,4), (4,1), (4,3)这些桌子,一共是11张。
为保证正确性,你可以按照如下格式编程
int main()
{
int case;
scanf("%d",&case);
while(case--){
//你的代码
}

}
试题6:电报解密
加拿大電信有一特殊的报文,把原始信息拆解后,混入一些杂乱信息流再发送。现在我们要写一个函数,目的是从收到的信息流中加工出有效的内容。

int decollator(const char SOH[ ], char text[ ])
{
...
}

SOH 是以0值结尾的string。他保存待处理的信息流;
text 保存提炼出的有效信息,他已分配了足夠空间,函数中不必考虑溢出问题;
返回值 是text中字符个数。

处理规则如下:
1、 搜索信息流中的 ‘1’ 和‘0’,每找到8个一组 就按照“二进制数”特征转为ASCII字符,如果这个字符是可打印字符(meaningful character)即为有效字符,保存
例如 01100001 -> 97 -> 'a' (‘a’将收录到text中)
2、 如果遇到信息流结尾,或规则3、4情况时,8个一组的‘1’或‘0’并没找齐,那么用‘0’补齐再处理
3、 信息流中出现关键字“RPT”并且紧跟一个自然数n(n不超过255),那么:将刚才得到的有效字符重复n次
例如: " 01100010 RTP9 " -> "bbbbbbbbb" (九个‘b’将收录到text中)
4、 信息流中出现关键字“SKP”,那么:忽略信息流中接下来的8个‘1’或‘0’
试题7:用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。 你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
1.输入:
输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K个互不相同的钱币面值Ki(1 <= Ki <= 1000)。输入M=0时结束。
2.输出:
每个测

试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
3.样例输入/输出,
输入:
15
6 2 5 10 20 50 100
1
1 2
0
输出:
2
Impossible


相关文档
最新文档