练习4-3 求给定精度的简单交错序列部分和

本题要求编写程序,计算序列部分和 PTA编程—循环2 - 图1 直到最后一项的绝对值不大于给定精度eps
输入格式:
输入在一行中给出一个正实数eps
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:

  1. 4E-2

输出样例1:

  1. sum = 0.854457

输入样例2:

  1. 0.02

输出样例2:

  1. sum = 0.826310

解题思路:本题很坑,题目明确不告诉你为何第一项不管是否满足要求都要输出。因此需要在执行循环之前手动跳过第一次,那么非 do-while 循环不可。

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main () {
  4. double eps;
  5. scanf("%lf", &eps);
  6. int sign = 1, denominator = 1;
  7. double item = 1.0, sum = 0.0;
  8. do {
  9. sum += item;
  10. denominator += 3;
  11. sign *= -1;
  12. item = sign * 1.0 / denominator;
  13. } while (fabs(item) >= eps);
  14. printf("sum = %f\n", sum);
  15. return 0;
  16. }

运行结果:

Case Hint Result Run Time Memory
0 sample 1 一般数据 Accepted 3 ms 280 KB
1 eps正好等于尾项 Accepted 3 ms 384 KB
2 首项等于eps Accepted 3 ms 296 KB
3 eps超过首项 Accepted 3 ms 296 KB

练习4-6 猜数字游戏

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:

  1. 58 4
  2. 70
  3. 50
  4. 56
  5. 58
  6. 60
  7. -2

输出样例:

  1. Too big
  2. Too small
  3. Too small
  4. Good Guess!

解题思路:

  1. 根据第一行获得谜底+总猜测次数
  2. 猜中:
    1. 在第 1 次猜中则是 Bingo!
    2. 在第 2-3 次猜中则是 Lucky You!
    3. 在第 4-n 次猜中则是 Good Guess!
  3. 没猜中:
    1. n 次内都没中:即次数用完
    2. 不玩了:主动输入负数退出游戏 ```c

      include

int main () { int riddle, maxTime, guess; scanf(“%d %d”, &riddle, &maxTime); for (int i = 0; i < maxTime; i++) { scanf(“%d”, &guess); if (guess > riddle) { printf(“Too big\n”); } else if (guess < 0) { break; } else if (guess < riddle) { printf(“Too small\n”); } else if (guess == riddle) { if (0 == i) { // 第一次就猜中 printf(“Bingo!”); return 0; } else if (i <= 2) { // 3 次内猜中 printf(“Lucky You!”); return 0; } else { // 4->N 次内 printf(“Good Guess!”); return 0; } } } printf(“Game Over\n”); return 0; }

  1. | Case | Hint | Result | Run Time | Memory |
  2. | --- | --- | --- | --- | --- |
  3. | 0 | sample 超过3次、正好N次猜出 | Accepted<br />
  4. | 3 ms | 368 KB |
  5. | 1 | 1次猜中 | Accepted<br />
  6. | 3 ms | 372 KB |
  7. | 2 | 3次猜中 | Accepted<br />
  8. | 3 ms | 376 KB |
  9. | 3 | 超过N次猜对无效 | Accepted<br />
  10. | 3 ms | 372 KB |
  11. | 4 | 直接退出 | Accepted<br />
  12. | 3 ms | 256 KB |
  13. <a name="8pPwV"></a>
  14. # [练习4-7 求e的近似值](https://pintia.cn/problem-sets/12/problems/284)
  15. 自然常数 _e_ 可以用级数 ![](https://cdn.nlark.com/yuque/__latex/f958298160242310a569c023f5ff1a23.svg#card=math&code=1%2B%5Cfrac%7B1%7D%7B1%21%7D%2B%5Cfrac%7B1%7D%7B2%21%7D%2B%5Ccdots%2B%5Cfrac%7B1%7D%7Bn%21%7D%2B%5Ccdots&height=38&id=QYGEj) 来近似计算。本题要求对给定的非负整数 `_n_`,求该级数的前 `n+1` 项和。<br />**输入格式:**<br />输入第一行中给出非负整数 _n_(≤1000)。<br />**输出格式:**<br />在一行中输出部分和的值,保留小数点后八位。<br />**输入样例:**

10

  1. **输出样例:**

2.71828180

  1. **解题思路**:凡是遇到分数一律使用 `double` `float` 早就因为数据溢出而被 `WA` ,很简单,不管如何一定输出第一项。
  2. ```c
  3. #include <stdio.h>
  4. #include <math.h>
  5. int main () {
  6. int n;
  7. scanf("%d", &n);
  8. double denominator = 1.0, sum = 1.0;
  9. for (int i = 1; i <= n; i++) {
  10. denominator *= i;
  11. sum += 1.0 / denominator;
  12. }
  13. printf("%.8f\n", sum);
  14. return 0;
  15. }

运行结果

Case Hint Result Run Time Memory
0 sample 一般小n Accepted 2 ms 256 KB
1 最小n Accepted 2 ms 256 KB
2 次小n Accepted 2 ms 256 KB
3 最大n Accepted 2 ms 256 KB

练习4-10 找出最小值

本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数_n_,之后是_n_个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:

  1. 4 -2 -123 100 0

输出样例:

  1. min = -123

解题思路:首先需要第一个比较的人,因此第一次输入总人数的同时还输入第一个数作为最小值,因此剩余遍历次数就是 n-1 次。

  1. #include <stdio.h>
  2. int main () {
  3. int n, min, x;
  4. scanf("%d %d", &n, &min);
  5. for (int i = 0; i < n - 1; i++) {
  6. scanf("%d", &x);
  7. if (x < min) {
  8. min = x;
  9. }
  10. }
  11. printf("min = %d\n", min);
  12. return 0;
  13. }

运行结果

Case Hint Result Run Time Memory
0 sample等价,有正负数和零 Accepted 2 ms 256 KB
1 最小值为0 Accepted 2 ms 256 KB
2 n=1,最小值为正 Accepted 2 ms 256 KB

练习4-11 统计素数并求和

本题要求统计给定整数_M__N_区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数MNPTA编程—循环2 - 图2)。
输出格式:
在一行中顺序输出MN区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:

  1. 10 31

输出样例:

  1. 7 143

解题思路:素数定义:PTA编程—循环2 - 图3的数只能被自身或者 1 整除的数,但是区间内含有很多乱七八糟的数字,只需要用PTA编程—循环2 - 图4 处理后续即可。

  1. #include <stdio.h>
  2. int isPrime(int x) {
  3. for (int i = 2; i * i <= x; i++) {
  4. if (0 == x % i) {
  5. return 0;
  6. }
  7. }
  8. return 1 < x; // 1不是素数
  9. }
  10. int main () {
  11. int start, end, cnt = 0, sum = 0;
  12. scanf("%d %d", &start, &end);
  13. while (start <= end) {
  14. if (isPrime(start)) {
  15. sum += start;
  16. cnt++;
  17. }
  18. start++;
  19. }
  20. printf("%d %d\n", cnt, sum);
  21. return 0;
  22. }

运行结果

Case Hint Result Run Time Memory
0 sample等价 Accepted 3 ms 380 KB
1 M==N,0 Accepted 3 ms 256 KB
2 M==N==素数 Accepted 3 ms 348 KB
3 M和N取最大边界 Accepted 3 ms 380 KB

习题4-1 求奇数和

本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:

  1. 8 7 4 3 70 5 6 101 -1

输出样例:

  1. 116

解题思路:IO 输入遇到 PTA编程—循环2 - 图5 结束,可以不使用数组,直接使用 scanf("%d", &x) 中去,每次判断奇数累加即可。

  1. #include <stdio.h>
  2. int main () {
  3. int n, sum = 0;
  4. scanf("%d", &n);
  5. while (0 < n) {
  6. if (n & 1) {
  7. sum += n;
  8. }
  9. scanf("%d", &n);
  10. }
  11. printf("%d\n", sum);
  12. return 0;
  13. }

运行结果:

Case Hint Result Run Time Memory
0 sample等价,负数结尾 Accepted 2 ms 256 KB
1 以0结尾 Accepted 3 ms 256 KB
2 全偶数,-2结尾 Accepted 3 ms 256 KB
3 较大规模数据 Accepted 3 ms 256 KB
4 空集 Accepted 3 ms 256 KB

习题4-2 求幂级数展开的部分和

已知函数 PTA编程—循环2 - 图6 可以展开为幂级数 PTA编程—循环2 - 图7。现给定一个实数 x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001
输入格式:
输入在一行中给出一个实数 PTA编程—循环2 - 图8
输出格式:
在一行中输出满足条件的幂级数部分和,保留小数点后四位。
输入样例:

  1. 1.2

输出样例:

  1. 3.3201

解题思路:本题给定字眼就是包含最后一个不满足条件的项!!与之前的都是不同,就是要向后看!当前满足了就往后再加一次。即第一项是满足的, while 循环第一次开始就是预测第二项的值并相加,当到达最后一项的时候,此时不满足 while 条件,但是此项已在上次循环中添加,因此得到正确答案。

  1. #include <stdio.h>
  2. #define EPS 0.00001
  3. int main () {
  4. double x;
  5. scanf("%lf", &x);
  6. double item = 1.0, sum = 1.0, denominator = 1.0, numerator = 1.0;
  7. int k = 1;
  8. while (item >= EPS) {
  9. denominator *= k;
  10. numerator *= x;
  11. item = numerator / denominator;
  12. k++;
  13. sum += item; // 向后看!
  14. }
  15. printf("%.4f\n", sum);
  16. return 0;
  17. }

运行结果

Case Hint Result Run Time Memory
0 sample 一般小x Accepted 2 ms 296 KB
1 x<1 Accepted 2 ms 384 KB
2 x==1 Accepted 2 ms 256 KB
3 最大x Accepted 2 ms 256 KB
4 最小x Accepted 2 ms 256 KB

习题4-3 求分数序列前N项和

本题要求编写程序,计算序列 PTA编程—循环2 - 图9 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:

  1. 20

输出样例:

  1. 32.66

解题思路:输入数据只可能是正整数,因此对于第一项可以单独处理(题目第二项开始才有规律)

  1. #include <stdio.h>
  2. int main () {
  3. int n;
  4. scanf("%d", &n);
  5. double sum = 2.0, denominator = 1.0, numerator = 2.0, tmp;
  6. for (int i = 2; i <= n; i++) {
  7. tmp = numerator;
  8. numerator = numerator + denominator;
  9. denominator = tmp;
  10. sum += numerator / denominator;
  11. }
  12. printf("%.2f\n", sum);
  13. return 0;
  14. }

运行结果:

Case Hint Result Run Time Memory
0 sample等价 Accepted 4 ms 256 KB
1 N最小 Accepted 4 ms 384 KB
2 1次循环 Accepted 4 ms 384 KB
3 较大N Accepted 4 ms 284 KB

习题4-4 特殊a串数列求和

给定两个均不超过9的正整数_a__n_,要求编写程序求PTA编程—循环2 - 图10之和。
输入格式:
输入在一行中给出不超过9的正整数_a__n_
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:

  1. 2 3

输出样例:

  1. s = 246

解题思路:使用前一项的值 * 10 + a 获取此项,如此重复 n 次即可。

  1. #include <stdio.h>
  2. int main () {
  3. int a, n;
  4. scanf("%d %d", &a, &n);
  5. int sum = 0, item = a;
  6. for (int i = 1; i <= n; i++) {
  7. sum += item;
  8. item = item * 10 + a;
  9. }
  10. printf("s = %d\n", sum);
  11. return 0;
  12. }

运行结果:

Case Hint Result Run Time Memory
0 sample等价 Accepted 2 ms 364 KB
1 最小a和n Accepted 2 ms 360 KB
2 最大a和n Accepted 2 ms 256 KB

习题4-5 换硬币

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额 PTA编程—循环2 - 图11
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:

  1. 13

输出样例:

  1. fen5:2, fen2:1, fen1:1, total:4
  2. fen5:1, fen2:3, fen1:2, total:6
  3. fen5:1, fen2:2, fen1:4, total:7
  4. fen5:1, fen2:1, fen1:6, total:8
  5. count = 4

解题思路:暴力求解即可,先计算最大面值硬币的最多个数,以此向 1 枚极限枚举面值更小的,当在面值为 1 的时候还有钱,肯定是一种解决方案。

  1. #include <stdio.h>
  2. int main () {
  3. int money, cnt = 0;
  4. scanf("%d", &money);
  5. for (int i = money / 5; i > 0; i--) {
  6. for (int j = (money - i * 5) / 2; j > 0; j--) {
  7. int penny = money - i * 5 - j * 2;
  8. if (penny >= 1) {
  9. printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",
  10. i, j, penny, i + j + penny);
  11. cnt++;
  12. }
  13. }
  14. }
  15. printf("count = %d\n", cnt);
  16. return 0;
  17. }

运行结果:

Case Hint Result Run Time Memory
0 sample 一般小x Accepted 3 ms 256 KB
1 最小x Accepted 3 ms 256 KB
2 最大x Accepted 3 ms 256 KB

习题4-6 水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:

  1. 3

输出样例:

  1. 153
  2. 370
  3. 371
  4. 407

解题思路:使用数学函数进行操作

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main() {
  4. int n;
  5. scanf("%d", &n);
  6. int start = (int)pow(10, n - 1), end = (int)pow(10, n) - 1;
  7. for (int number = start; number <= end; number++) {
  8. // 1.判断数字位数,<math.h>用log函数
  9. int cnt = (int)log10(number) + 1; // n 用于拷贝计算数字位数
  10. // 2.重新求和计算 digit ^ cnt
  11. int sum = 0;
  12. n = number; // 重新拷贝赋值number
  13. do {
  14. int remainder = n % 10, product = 1;
  15. for (int i = 0; i < cnt; i++) {
  16. product *= remainder; // 最多5次,即最大9^5,不会溢出
  17. }
  18. sum += product;
  19. n /= 10;
  20. } while (n);
  21. // 3.判断打印
  22. if (sum == number) {
  23. printf("%d\n", number);
  24. }
  25. }
  26. return 0;
  27. }

运行结果:暴力!

Case Hint Result Run Time Memory
0 sample等价, 4 Accepted
3 ms 256 KB
1 6, 只有1个 Accepted
83 ms 256 KB
2 N==5 Accepted
10 ms 296 KB
3 最大N,输出4个 Accepted
920 ms 256 KB

习题4-7 最大公约数和最小公倍数

本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:

  1. 511 292

输出样例:

  1. 73 2044

解题思路:gcd(a, b) 方法很多,使用辗转相除法解决,只要余数为 0 此时被除数就是 gcd 。最后就是 lcm 最小公倍数,PTA编程—循环2 - 图12求得。

  1. int gcd(int a, int b) {
  2. while (b != 0) {
  3. int tmp = b;
  4. b = a % b;
  5. a = tmp;
  6. }
  7. return a;
  8. }
  9. int main () {
  10. int m, n;
  11. scanf("%d %d", &m, &n);
  12. int _gcd = gcd(m, n);
  13. int lcm = m * n / _gcd;
  14. printf("%d %d", _gcd, lcm);
  15. return 0;
  16. }

运行结果:

Case Hint Result Run Time Memory
0 sample等价 Accepted 2 ms 340 KB
1 最大最小输入, 不整除 Accepted 2 ms 300 KB
2 最大最小输入, 整除 Accepted 2 ms 384 KB
3 一般整除 Accepted 2 ms 296 KB
4 最大公约数包含重复素因子 Accepted 3 ms 304 KB

习题4-8 高空坠球

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:

  1. 33 5

输出样例:

  1. 94.9 1.0

解题思路:由于球的第一次下落比较特殊,下降到地面时才计算路程,而它即将弹起的高度是向后“预测”出来的,因此存在第 n 次落地就应该开始计算第 n 次弹起高度。最重要的就是第 0 次落地是什么鬼?只能当特例判断,路程和高度都是 0 处理。

  1. int main () {
  2. double sn, n;
  3. scanf("%lf %lf", &sn, &n);
  4. if (0 == n) {
  5. printf("%.1f %.1f\n", 0, 0);
  6. return 0;
  7. }
  8. double s = sn, hn = sn / 2; // 初始化第一次,向后预测第一次弹起高度 hn
  9. for (int i = 2; i <= n; i++) { // 为什么从第二开始?
  10. s += hn * 2;
  11. hn /= 2;
  12. }
  13. printf("%.1f %.1f", s, hn);
  14. return 0;
  15. }

运行结果

Case Hint Result Run Time Memory
0 sample等价,较小数据 Accepted 3 ms 228 KB
1 输入较大数据 Accepted 3 ms 360 KB
2 高度为0 Accepted 3 ms 256 KB
3 N为0 Accepted 3 ms 236 KB

习题4-9 打印菱形图案

本题要求编写程序,打印一个高度为n的、由“”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n
输出格式:
输出由n行星号“
”组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:

  1. 7

输出样例:

  1. *
  2. * * *
  3. * * * * *
  4. * * * * * * *
  5. * * * * *
  6. * * *
  7. *

解题思路:根据如上用表格画出找出规律如下

空格 星星
6 * 1
4 * * * 3
2 * * * * * 5
0 * * * * * * * 7
2 * * * * * 5
4 * * * 3
6 * 1

根据以上规律很容易发现图形是对称的:空格数量和星星之和为 7 ,对称性就是 PTA编程—循环2 - 图13
PTA编程—循环2 - 图14

  1. #include <stdio.h>
  2. int main () {
  3. int n;
  4. scanf("%d", &n);
  5. int half = n / 2, asetrisk, space;
  6. for (int row = 0; row < n; row++) { // 1.控制行数
  7. if (0 <= row && row <= half) {
  8. asetrisk = 2 * row + 1;
  9. } else {
  10. asetrisk = 2 * (2 * half - row) + 1;
  11. }
  12. for (space = n - asetrisk; space > 0; space--) { // 2.打印前置空格
  13. printf(" ");
  14. }
  15. for (; asetrisk > 0; asetrisk--) { // 3.打印星号+空格
  16. printf("* ");
  17. }
  18. printf("\n"); // 4.换行
  19. }
  20. return 0;
  21. }

运行结果:

Case Hint Result Run Time Memory
0 sample等价 Accepted 5 ms 296 KB
1 最小奇数1 Accepted 11 ms 256 KB
2 次小奇数3 Accepted 5 ms 384 KB

习题4-10 猴子吃桃问题

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<_N_≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:

  1. 3

输出样例:

  1. 10

解题思路:如测试题分析所示,分清楚吃之前和吃之后,将其分为早上(前一天剩的),中午开吃,晚上再剩下这样的逻辑进行思考就是理顺吃之前和前一天剩下是相等的概念。

  1. int main () {
  2. int n;
  3. scanf("%d", &n);
  4. int morning, night = 1;
  5. for (int i = 1; i < n; i++) {
  6. morning = 2 * (night + 1);
  7. night = morning;
  8. }
  9. printf("%d\n", morning);
  10. return 0;
  11. }

运行结果:

Case Hint Result Run Time Memory
0 sample等价 Accepted 3 ms 376 KB
1 最小N Accepted 3 ms 384 KB
2 最大N Accepted 3 ms 384 KB

习题4-11 兔子繁衍问题

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:

  1. 30

输出样例:

  1. 9

解题思路:本题就是斐波那契数列变形题目。

  1. #include <stdio.h>
  2. int main () {
  3. int n, first = 1, second = 1, days = 2;
  4. scanf("%d", &n);
  5. if (1 == n) { // base case
  6. printf("%d\n", 1);
  7. return 0;
  8. }
  9. while (first < n) {
  10. int tmp = first;
  11. first += second;
  12. second = tmp;
  13. days++;
  14. }
  15. printf("%d\n", days);
  16. return 0;
  17. }

输出结果

Case Hint Result Score Run Time Memory
0 sample等价 Accepted 8 2 ms 256 KB
1 第1对生产 Accepted 2 2 ms 256 KB
2 正好达到的N Accepted 2 3 ms 256 KB
3 最小N Accepted 1 2 ms 256 KB
4 最大N Accepted 2 3 ms 256 KB

习题8-10 输出学生成绩

本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式:
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:

  1. average = 平均成绩
  2. max = 最高成绩
  3. min = 最低成绩

结果均保留两位小数。
输入样例:

  1. 3
  2. 85 90 95

输出样例:

  1. average = 90.00
  2. max = 95.00
  3. min = 85.00

解题思路while 循环输入即可,使用 float/double 记录更新。

  1. #include <stdio.h>
  2. int main () {
  3. int n;
  4. scanf("%d", &n);
  5. float sum = 0.0f, max = 0.0f, min = 100.0f, score;
  6. for (int i = 0; i < n; i++) {
  7. scanf("%f", &score);
  8. if (max < score) {
  9. max = score;
  10. }
  11. if (min > score) {
  12. min = score;
  13. }
  14. sum += score;
  15. }
  16. printf("average = %.2f\n", sum / n);
  17. printf("max = %.2f\n", max);
  18. printf("min = %.2f\n", min);
  19. return 0;
  20. }

运行结果

Case Hint Result Run Time Memory
0 sample等价,较小N Accepted 10 ms 312 KB
1 较大N Accepted 13 ms 256 KB
2 只有1个学生 Accepted 7 ms 256 KB