收藏 分销(赏)

ACM第三次培训题目及答案.doc

上传人:仙人****88 文档编号:11831743 上传时间:2025-08-14 格式:DOC 页数:15 大小:210.50KB 下载积分:10 金币
下载 相关 举报
ACM第三次培训题目及答案.doc_第1页
第1页 / 共15页
ACM第三次培训题目及答案.doc_第2页
第2页 / 共15页


点击查看更多>>
资源描述
2075 A|B? Problem Description 正整数A是否能被正整数B整除,不知道为什么xhd会研究这个问题,来帮帮他吧。 Input 输入数据的第一行是一个数据T,表示有T组数据。 每组数据有两个正整数A和B(A,B<10^9)。 Output 对于每组输入数据,输出"YES"表示可以被整除,"NO"表示不能被整除。 Sample Input 2 4 2 5 3 Sample Output YES NO Author xhd Source ACM程序设计期末考试_热身赛(感谢 xhd & 8600) Recommend lcy 2014 青年歌手大奖赛_评委会打分 Problem Description 青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。 Input 输入数据有多组,每组占一行,每行的第一个数是n(2<n<100),表示评委的人数,然后是n个评委的打分。 Output 对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。 Sample Input 3 99 98 97 4 100 99 98 97 Sample Output 98.00 98.50 Author lcy Source C语言程序设计练习(三) Recommend lcy 2008 数值统计 Problem Description 统计给定的n个数中,负数、零和正数的个数。 Input 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。 Output 对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。 Sample Input 6 0 1 2 3 -1 0 5 1 2 3 4 0.5 0 Sample Output 1 2 3 0 0 5 Author lcy Source C语言程序设计练习(二) Recommend JGShining 2017 字符串统计 Problem Description 对于给定的一个字符串,统计其中数字字符出现的次数。 Input 输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。 Output 对于每个测试实例,输出该串中数值的个数,每个输出占一行。 Sample Input 2 asdfasdf123123asdfasdf asdf111111111asdfasdfasdf Sample Output 6 9 Author lcy Source C语言程序设计练习(三) Recommend lcy 2020 绝对值排序 Problem Description 输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。 Input 输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。 Output 对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。 Sample Input 3 3 -4 2 4 0 1 2 -3 0 Sample Output -4 3 2 -3 2 1 0 Author lcy Source C语言程序设计练习(三) Recommend lcy 2006 求奇数的乘积 Problem Description 给你n个整数,求他们中所有奇数的乘积。 Input 输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。 Output 输出每组数中的所有奇数的乘积,对于测试实例,输出一行。 Sample Input 3 1 2 3 4 2 3 4 5 Sample Output 3 15 Author lcy Source C语言程序设计练习(一) Recommend JGShining 2005 第几天? Problem Description 给定一个日期,输出这个日期是该年的第几天。 Input 输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。 Output 对于每组输入数据,输出一行,表示该日期是该年的第几天。 Sample Input 1985/1/20 2006/3/12 Sample Output 20 71 Author lcy Source C语言程序设计练习(一) Recommend JGShining 2015 偶数求和 Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列 Input 输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。 Output 对于每组输入数据,输出一个平均值序列,每组输出占一行。 Sample Input 3 2 4 2 Sample Output 3 6 3 7 Author lcy Source C语言程序设计练习(三) Recommend lcy 2015问题分析 Problem Analyse 本题是为C语言初学者提供的。 Algorithm Analyse 解决这个问题,关键是要解决给出一个偶数X,求出从它开始连续的m个偶数的和 而这个问题只要用等差数列求和公式就可以了。 编码建议 Programing 从题目中可以看出,当这一组的第一个数是X时,下一组的第一个数就是X+2*m 而从X开始连续m个偶数的和就是: {X + [X + 2×(m - 1)]} × m / 2 = (X + m - 1) × m; 所以平均数就是X + m - 1 #include <stdio.h> int main(void) { int i, n, m, b, c; while (scanf("%d%d", &n, &m) != EOF) { b = 2; c = 0; for (i = 0 ; i < n / m ; i++) { printf(c++ ? " %d" : "%d", b + m - 1); b += m * 2; } printf(n % m ? " %d\n" : "\n", b + n % m - 1); } return 0; } 2017问题分析 Problem Analyse 本题是为C语言初学者提供的。 Algorithm Analyse 因为本题只要求输出每一行数字的个数。所以不需要把那些字符记录下来。 因此不需要开个字符数组去记录。而且如果你想开也不知道该开多大,因为题目中没有提示一行最多有几个。 而判断行末就判断是否为'\n'就可以。 编码建议 Programing 判断是否为数字,直接调用库函数isdigit(); 语法: #include <ctype.h> int isdigit( int ch ); 功能:如果参数是0到9之间的数字字符,函数返回非零值,否则返回零值. #include <ctype.h> #include <stdio.h> int main(void) { int n, d; char c; scanf("%d%*c", &n); while (n--) { for (d = 0 ; (c = getchar()) != '\n' ;) { if (isdigit(c)) d++; } printf("%d\n", d); } return 0; } 2020问题分析 Problem Analyse 本题是为C语言初学者提供的。 Algorithm Analyse 这题的考点就是排序。 对初学者来说,比较熟悉的排序是“冒泡排序”和“选择排序”。 在排升序的时候,元素比较用'<',降序用'>'。 对于整数等基本数据类型,这样的比较符号很容易理解。但换了其他比较规则,你是不是还能很好地理解呢?呵呵。 就像本题的规则:比较数的绝对值的大小,在这里-3 > 1,所以就不能直接用'>',而是要自己制定一套大小规则。 刚开始可能不习惯看到 -3 > 1这样的规则,熟悉后就好了。 编码建议 Programing 你可以自己写一个判断大小的函数int cmp(a, b) 如果a > b返回大于0的值,a = b 返回0,a < b 返回小于0的值 ANSI C里的qsort()就是这样做的。用一个比较函数来提高排序函数的通用性。 这里的比较规则就是return abs(*b) - abs(*a); #include <math.h> #include <stdio.h> #include <stdlib.h> int cmp(const int *a, const int *b) { return abs(*b) - abs(*a); } int main(void) { int n, i, x[101]; while (scanf("%d", &n), n) { for (i = 0 ; i < n ; i++) scanf("%d", x + i); qsort(x, n, sizeof(int), cmp); for (i = 0 ; i < n ; i++) printf("%d%c", x[i], (i != n - 1 ? ' ' : '\n')); } return 0; } 2014问题分析 Problem Analyse 本题是为C语言初学者提供的。 Algorithm Analyse 要实现的算法是:求整个数组的和、在数组中找最值。 找最值,可以先把第一个元素赋给max、min变量,做一次遍历,一一比较,把最大值存入max,最小值存入min。 也可以直接对数组进行排序,然后从第二个加到倒数第二个,这样就可以了,省去减两个最值。 编码建议 Programing 我的代码采用的是第一种方法。因为对于本题来说,它的效率是O(N)。 算法不难,可以直接看代码 这里稍微讨论一下第二种方法。 对于排序,我们可以直接调用库函数qsort(); 语法: #include <stdlib.h> void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) ); 功能: 对buf 指向的数据(包含num 项,每项的大小为size)进行快速排序。如果函数compare 的第一个参数小于第二个参数,返回负值;如果等于返回零值;如果大于返回正值。函数对buf 指向的数据按升序排序。 #include #include int cmp(const double *a, const double *b) { return *a > *b ? 1 : *a < *b ? -1 : 0; } int main(void) { int n, i; double x, y[100]; while (scanf("%d", &n) != EOF) { for (i = 0 ; i < n ; i++) scanf("%lf", y + i); qsort(y, n, sizeof(double), cmp); for (x = 0, i = 1 ; i < n - 1 ; i++) x += y[i]; printf("%.2f\n", x / (n - 2)); } return 0; } 你可能有疑问,为什么cmp函数不直接用return *a - *b; 这也就是我不打算用这种方法的原因了(虽然上面的代码可以Accpted),这就是这段代码的不稳定因素。 我们来做个实验: #include #include int main(void) { int i; double x; x = 0.123456; printf("%lf\n", x); for (i = 0 ; x - floor(x); i++) x *= 10; printf("%d\n", i); return 0; } 上面的代码的作用就是确定X小数点后有几位。 我相信所有人都知道它有6位小数。但它的运行结果却是17(因编译器而异)。 你可以自己复制代码去验证一下。 我们在循环体里插入printf("%lf\n", floor(x));看看它的变化是怎样的。 运行结果: 1.000000 12.000000 123.000000 1234.000000 12345.000000 123455.000000 1234559.000000 12345599.000000 123455999.000000 1234559999.000000 12345599999.000000 123455999999.000000 1234559999999.000000 12345599999999.000000 123455999999999.000000 1234559999999999.000000 12345599999999998.000000 这就是double型数据的精度问题。这是我们无法人为地控制的。所以建议尽量避免double的高精度运算。 #include <stdio.h> int main(void) { int n, i; double min, max; double x, y; while (scanf("%d", &n) != EOF) { scanf("%lf", &x); min = max = x; for (i = 1 ; i < n ; i++) { scanf("%lf", &y); x += y; if (y > max) max = y; if (y < min) min = y; } printf("%.2lf\n", (x - min - max) / (n - 2)); } return 0; } 2006问题分析 Problem Analyse 本题是为C语言初学者提供的。 前置知识:循环语句 Algorithm Analyse 循环+条件判断 编码建议 Programing 循环用for实现就可以了。 至于那个判断条件,一般是if (t % 2 == 1)。 但也可以简化为 if (t % 2) After Class 课外资料:在早期CPU处理的功能还不够强的时候,求X对于2^n的余数,可能不直接用%来运算。而是换成位运算。 X & (2^N - 1)。 比如求 N 余 8,写成 n & 7。 这样写可读性比较差。而且现在的机器性能提升了,一般的编译器也能自动转换这种优化。所以这种写法现在不推荐。仅做了解(当然如果你想炫耀一番自己的才华,那另当别论)。 #include <stdio.h> int main(void) { int n, i, s, t; while (scanf("%d", &n) != EOF) { for (s = 1, i = 0 ; i < n ; i++) { scanf("%d", &t); if (t & 1) s *= t; } printf("%d\n", s); } return 0; } 2008问题分析 Problem Analyse 本题是为C语言初学者提供的。 前置知识:if嵌套语法 Algorithm Analyse 算法与2004题雷同,但要注意这里上以0作为结束符,而不是EOF #include <stdio.h> int main(void) { int n, i, a, b, c; double x; while (scanf("%d", &n) , n) { a = b = c = 0; for (i = 0 ; i < n ; i++) { scanf("%lf", &x); if (x > 0) c++; else if (x < 0) a++; else b++; } printf("%d %d %d\n", a, b, c); } return 0; } 2075问题分析 Problem Analyse 简单题 Algorithm Analyse 差不多是考你基本输入输出了。我也不明白他们为什么研究这个问题。 #include<stdio.h> int main(void) { int n, a, b; scanf("%d", &n); while(n-- && scanf("%d%d", &a, &b)) puts(a % b ? "NO" : "YES"); return 0; } 2005问题分析 Problem Analyse 本题是为C语言初学者提供的。 前置知识:基本历法知识 Algorithm Analyse 判断N是否为闰年的方法是:N能4整数但不能被100整除 或者 N能被400整除 算出第N年的每个月的天数后就从一月开始累加,不要忘了最后要加天数哦。^_^ 编码建议 Programing 把判断闰年的算法写成一个宏: #define lev(n) (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0)) 是闰年返回1,否则返回0。 再开一个二维数组来保存闰年和非闰年每个月的天数。 这样做可以减少编码的复杂度。 当然,对于这样的简单题能通过的就是好代码。 #include <math.h> #include <stdio.h> #define lev(n) (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0)) int main(void) { int y, m, d, i, s; int month[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; while (scanf("%d/%d/%d", &y, &m, &d) != EOF) { for (s = 0, i = 1 ; i < m ; i++) s += month[lev(y)][i]; s += d; printf("%d\n", s); } return 0; }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服