c语言程序设计竞赛题及其答案
数学与统计学院
第三届计算机程序设计竞赛题
竞赛需知:
1、 答案必须写在答题纸上。
2、 程序采用C/JAVA /VB/VFP语言实现均可。
3、 考虑到各种因素,程序的键盘输入和结果输出可以用伪代码或者自然语言表示。但是必
须说明输入变量和输出变量。
4、 题目最好能用完整、正确的语言程序来解决问题,如确实无法编写完整语言程序的,可
以写出程序主要框架和流程,必要时可以用伪代码或者自然语言描述算法(程序)。
一、玫瑰花数(20分)
如果一个四位数等于它的每一位数的4次方之和,则称为玫瑰花数。例如:
1634=1^4+6^4+3^4+4^4,
编程输出所有的玫瑰花数。
#include
void main()
{
int i,j,k,l,m;
for(i=999;i
{
j=i/1000;
k=i%10;
l=i/100-10*j;
m=i/10-100*j-10*l;
if(i==j*j*j*j+k*k*k*k+l*l*l*l+m*m*m*m)
printf("%d\n",i);
}
}
二、菱形图案(20分)
对给定的奇数n ,编程打印菱形图案。
输入样例:
7
输出样例:
*
***
*****
*******
*****
***
*
#include
#include
void main()
{
int i,j,k;
int n;
scanf("%d",&n);
for(i=0;i
{ for(j=0;j
printf(" ");
for(k=0;k
printf("*");
printf("\n");
}
}
三、钻石奖励(20分)
海盗们决定用“投环套物”的方式来奖励最近一次行动中贡献最大的人。他们将1克拉钻石排列成矩阵,通过投掷圆环决定奖励的钻石的数量。假设每个钻石的x 和y 坐标都是1到99的整数,输入矩阵及圆形,请你帮他们判断一下这个人能获得多少克拉的钻石。
* * * *
* *
* 输入格式
输入数据包含两行,第一行为矩阵的行数及列数,第二行为圆心的坐标点及半径。
输出格式
输出数据为圆形内的钻石的克拉数(包括圆形边上的钻石)。
输入样例
4 4
2 1 1
输出样例
5
#include
#include
void main()
{
int i,j,x,y;
float r;
int a,b,count=0;
printf("请输入矩阵的行列i,j:");
scanf("%d %d",&i,&j);
printf("请输入圆心的坐标点及半径x,y,r:");
scanf("%d %d %f",&x,&y,&r);
for(a=0;a
for(b=0;b
if(sqrt((a-x)*(a-x)+(b-y)*(b-y))
count++;
printf("钻石个数:%d",count);
}
四、连续正整数(20分)
一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如:
15=1+2+3+4+5 15=4+5+6 15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
输入数据:一个正整数,以命令行参数的形式提供给程序。
输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出 “NONE ” 。
例如,对于15,其输出结果是:
1 2 3 4 5
4 5 6
7 8
对于16,其输出结果是:
NONE
#include
void main()
{
int i,j,h,k,n;
n=1;k=0;
scanf("%d",i);
for(j=1;j
{
k=k+j;
if(k==i)
{for(h=n;h
printf("%d "h);
printf("\n");n++;}
j++;
}
}
五、(密钥短语密码)(20分)
让我们选一个英文短语, 称其为密钥字(key word) 或密钥短语(key phrase) ,如HAPPY NEWYEAR, 按顺序去掉重复字母和空格得HAPYNEWR 。将它依次写在明文字母表之下, 而后再将明文字母表中未在短语中出现过的字母依次写在此短语之后, 就可构造出一个代替表, 如下所示:
明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文:HAPYNEWRBCDFGIJKLMOQSTUVXZ
请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表(即上面的那个表),然后可以对用户输入的明文进行加密。
输入样例:
明文:ILoveHuiwen
输出样例:
密文:BFjtnRsbuni
#include
void main()
{
int i,j,h,k,n;
n=1;k=0;
scanf("%d",i);
for(j=1;j
{
k=k+j;
if(k==i)
{for(h=n;h
printf("%d "h);
printf("\n");n++;}
j++;
}
}
六、最少钱币(附加题20分)
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。
你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
输入:
第一行是待凑的钱数值M (1
输出:
输出一行,即凑成钱数值M 最少需要的钱币个数。如果凑钱失败,输出“Impossible ”。你可以假设,每种待凑钱币的数量是无限多的。
输入样例:
15
6 2 5 10 20 50 100
输出样例:
2
#include
#include
void main()
{
int M,K,i;
int a[10];
printf("请输入待凑钱数M :");
scanf("%d",&M);
printf("请输入币种个数K:");
scanf("%d",&K);
for(i=0;i
scanf("%d",&a[i]);
if(M2000||K10) {
printf("Impossible"); exit(0);
}
for(i=0;i
if(M%a[i]==0)
}