C语言程序设计竞赛题及其答案
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Байду номын сангаас
** * * 输入格式 输入数据包含两行,第一行为矩阵的行数及列数,第二行为圆心的坐标点及半径。 输出格式 输出数据为圆形内的钻石的克拉数(包括圆形边上的钻石) 。 输入样例 4 4 2 1 1 输出样例 5 #include<stdio.h> #include<math.h> 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<i;a++) for(b=0;b<j;b++) if(sqrt((a-x)*(a-x)+(b-y)*(b-y))<=r) count++;
int i,j,k; int n; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<fabs(n/2-i);j++) printf(" "); for(k=0;k<n-2*j;k++) printf("*"); printf("\n"); } } 三、钻石奖励(20 分) 海盗们决定用“投环套物”的方式来奖励最近一次行动中贡献最大的人。他们将 1 克拉钻石排 列成矩阵,通过投掷圆环决定奖励的钻石的数量。假设每个钻石的 x 和 y 坐标都是 1 到 99 的整数, 输入矩阵及圆形,请你帮他们判断一下这个人能获得多少克拉的钻石。 ** ** ** * * * * * *
数学与统计学院 第三届计算机程序设计竞赛题 竞赛需知: 1、 答案必须写在答题纸上。 2、 程序采用 C/JAVA /VB/VFP 语言实现均可。 3、 考虑到各种因素,程序的键盘输入和结果输出可以用伪代码或者自然语言表示。但是必 须说明输入变量和输出变量。 4、 题目最好能用完整、正确的语言程序来解决问题,如确实无法编写完整语言程序的,可 以写出程序主要框架和流程,必要时可以用伪代码或者自然语言描述算法(程序) 。 一、玫瑰花数(20 分) 如果一个四位数等于它的每一位数的 4 次方之和,则称为玫瑰花数。例如: 1634 1^ 4 6^ 4 3^ 4 4^ 4 , 编程输出所有的玫瑰花数。 #include<stdio.h> void main() { int i,j,k,l,m; for(i=999;i<=9999;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<stdio.h> #include<math.h> void main() {
scanf("%d",&K); for(i=0;i<K;i++) scanf("%d",&a[i]); if(M<1||M>2000||K<1||K>10) { printf("Impossible"); exit(0); } for(i=0;i<K;i++) if(M%a[i]==0) }
五、 (密钥短语密码) (20 分) 让我们选一个英文短语, 称其为密钥字(key word)或密钥短语(key phrase), 如 HAPPY NEWYEAR, 按顺序去掉重复字母和空格得 HAPYNEWR。将它依次写在明文字母表之下, 而后再将明文字母表中 未在短语中出现过的字母依次写在此短语之后, 就可构造出一个代替表, 如下所示: 明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文:HAPYNEWRBCDFGIJKLMOQSTUVXZ 请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表(即上面的那个表) ,然 后可以对用户输入的明文进行加密。 输入样例: 明文:ILoveHuiwen
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<stdio.h> void main() { int i,j,h,k,n; n=1;k=0; scanf("%d",i); for(j=1;j<=i/2+1;j++) { k=k+j; if(k==i) {for(h=n;h<=i/2+1;h++) printf("%d "h); printf("\n");n++;} j++; } }
输出样例: 密文:BFjtnRsbuni #include<stdio.h> void main() { int i,j,h,k,n; n=1;k=0; scanf("%d",i); for(j=1;j<=i/2+1;j++) { k=k+j; if(k==i) {for(h=n;h<=i/2+1;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 <= 2000,整数) ,接着的一行中,第一个整数 K(1 <= K <= 10)表示币种个数,随后是 K 个互不相同的钱币面值 Ki(1 <= Ki <= 1000)。输入 M=0 时结束。 输出: 输出一行,即凑成钱数值 M 最少需要的钱币个数。如果凑钱失败,输出“Impossible” 。你 可以假设,每种待凑钱币的数量是无限多的。 输入样例: 15 6 2 5 10 20 50 100 输出样例: 2 #include<stdio.h> #include<stdlib.h> void main() { int M,K,i; int a[10]; printf("请输入待凑钱数 M:"); scanf("%d",&M); printf("请输入币种个数 K:");
** * * 输入格式 输入数据包含两行,第一行为矩阵的行数及列数,第二行为圆心的坐标点及半径。 输出格式 输出数据为圆形内的钻石的克拉数(包括圆形边上的钻石) 。 输入样例 4 4 2 1 1 输出样例 5 #include<stdio.h> #include<math.h> 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<i;a++) for(b=0;b<j;b++) if(sqrt((a-x)*(a-x)+(b-y)*(b-y))<=r) count++;
int i,j,k; int n; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<fabs(n/2-i);j++) printf(" "); for(k=0;k<n-2*j;k++) printf("*"); printf("\n"); } } 三、钻石奖励(20 分) 海盗们决定用“投环套物”的方式来奖励最近一次行动中贡献最大的人。他们将 1 克拉钻石排 列成矩阵,通过投掷圆环决定奖励的钻石的数量。假设每个钻石的 x 和 y 坐标都是 1 到 99 的整数, 输入矩阵及圆形,请你帮他们判断一下这个人能获得多少克拉的钻石。 ** ** ** * * * * * *
数学与统计学院 第三届计算机程序设计竞赛题 竞赛需知: 1、 答案必须写在答题纸上。 2、 程序采用 C/JAVA /VB/VFP 语言实现均可。 3、 考虑到各种因素,程序的键盘输入和结果输出可以用伪代码或者自然语言表示。但是必 须说明输入变量和输出变量。 4、 题目最好能用完整、正确的语言程序来解决问题,如确实无法编写完整语言程序的,可 以写出程序主要框架和流程,必要时可以用伪代码或者自然语言描述算法(程序) 。 一、玫瑰花数(20 分) 如果一个四位数等于它的每一位数的 4 次方之和,则称为玫瑰花数。例如: 1634 1^ 4 6^ 4 3^ 4 4^ 4 , 编程输出所有的玫瑰花数。 #include<stdio.h> void main() { int i,j,k,l,m; for(i=999;i<=9999;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<stdio.h> #include<math.h> void main() {
scanf("%d",&K); for(i=0;i<K;i++) scanf("%d",&a[i]); if(M<1||M>2000||K<1||K>10) { printf("Impossible"); exit(0); } for(i=0;i<K;i++) if(M%a[i]==0) }
五、 (密钥短语密码) (20 分) 让我们选一个英文短语, 称其为密钥字(key word)或密钥短语(key phrase), 如 HAPPY NEWYEAR, 按顺序去掉重复字母和空格得 HAPYNEWR。将它依次写在明文字母表之下, 而后再将明文字母表中 未在短语中出现过的字母依次写在此短语之后, 就可构造出一个代替表, 如下所示: 明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文:HAPYNEWRBCDFGIJKLMOQSTUVXZ 请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表(即上面的那个表) ,然 后可以对用户输入的明文进行加密。 输入样例: 明文:ILoveHuiwen
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<stdio.h> void main() { int i,j,h,k,n; n=1;k=0; scanf("%d",i); for(j=1;j<=i/2+1;j++) { k=k+j; if(k==i) {for(h=n;h<=i/2+1;h++) printf("%d "h); printf("\n");n++;} j++; } }
输出样例: 密文:BFjtnRsbuni #include<stdio.h> void main() { int i,j,h,k,n; n=1;k=0; scanf("%d",i); for(j=1;j<=i/2+1;j++) { k=k+j; if(k==i) {for(h=n;h<=i/2+1;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 <= 2000,整数) ,接着的一行中,第一个整数 K(1 <= K <= 10)表示币种个数,随后是 K 个互不相同的钱币面值 Ki(1 <= Ki <= 1000)。输入 M=0 时结束。 输出: 输出一行,即凑成钱数值 M 最少需要的钱币个数。如果凑钱失败,输出“Impossible” 。你 可以假设,每种待凑钱币的数量是无限多的。 输入样例: 15 6 2 5 10 20 50 100 输出样例: 2 #include<stdio.h> #include<stdlib.h> void main() { int M,K,i; int a[10]; printf("请输入待凑钱数 M:"); scanf("%d",&M); printf("请输入币种个数 K:");