【PTA-C语言】编程练习3 - 循环结构Ⅱ
- 如果代码存在问题,麻烦大家指正 ~ ~
- 有帮助麻烦点个赞 ~ ~
编程练习3 - 循环结构(9~15)
- 7-9 特殊a串数列求和(分数 15)
- 7-10 穷举法搬运砖块问题(分数 15)
- 7-11 数字金字塔(分数 15)
- 7-12 输出N以内的所有素数(分数 15)
- 7-13 猜数字游戏(分数 15)
- 7-14 外星人的一天(分数 15)
- 7-15 整数的分类处理(分数 15)
7-9 特殊a串数列求和(分数 15)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int a, b, sum=0, i, x=0;
scanf("%d %d", &a, &b);
for (i = 1; i <= b; i++) {
x = x*10 + a;
sum += x;
}
printf("s = %d", sum);
return 0;
}
7-10 穷举法搬运砖块问题(分数 15)
这是中国古典算术问题,某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。有多少种搬法用N人正好搬N块砖?
输入格式:
输入正整数N。
输出格式:
输出所有满足条件的搬法,每种搬法占一行。
每行按如下格式依次输出该搬法中男人、女人、小孩的人数,按男人人数的递增顺序输出,中间用空格间隔(=
前后没有多余的空格,行末也无空格)。
men=男人数 women=女人数 child=小孩数
若没有满足条件的搬法,则输出"No solution!"
输入样例1:
45
输出样例1:
men=0 women=15 child=30
men=3 women=10 child=32
men=6 women=5 child=34
men=9 women=0 child=36
输入样例2:
1
输出样例2:
No solution!
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int n, i, j, k, t=0;
scanf("%d", &n);
for(i=0; i<=n/3; i++)
for(j=0; j<=n/2; j++){
k = (n-i*3-j*2)*2;
if(i+j+k == n) {
printf("men=%d women=%d child=%d\n", i, j, k);
t=1;
}
}
if(t==0)printf("No solution!\n");
return 0;
}
7-11 数字金字塔(分数 15)
输入一个正整数repeat (repeat<10),做repeat次下列运算:
- 输入一个正整数n(n<10),输出n行数字金字塔。
输出时使用以下语句:
printf(" ");
printf("%d ", i);
printf("\n");
输入格式:
输入在第1行中给出1个正整数repeat(repeat<10)
接下来repeat行,每行给出一个正整数n(n<10)
输出格式:
按照对应顺序的n值,依次输出repeat个数字金字塔
(n行数字金字塔的格式如样例所示,注意:每个数字后面跟一个空格。)
输入样例:
2
5
2
输出样例:
1
2 2 2
3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5
1
2 2 2
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include<stdio.h>
int main()
{
int repeat, i=0, n, m, p, q;
scanf("%d", &repeat);
for(i=0; i<repeat; i++){
scanf("%d", &n);
for(m=1; m<=n; m++){
for(q=n; q>m; q--)
printf(" ");
for(p=1; p<=2*m-1; p++)
printf("%d ", m);
printf("\n");
}
}
return 0;
}
7-12 输出N以内的所有素数(分数 15)
编程找出N(2≤N≤500)以内(即小于等于N)的所有素数。
输入格式:
输入整数N(2≤N≤500)。
输出格式:
每8个一行输出N以内的所有素数。注意每个数据均占5列,且采用右对齐。
输入样例1:
50
输出样例:
2 3 5 7 11 13 17 19
23 29 31 37 41 43 47
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
#include <math.h>
int isprime(int n)
{
if(n == 1) return 0;
for(int i = 2; i <= sqrt(n); i++) {
if(n % i == 0)
return 0;
}
return 1;
}
int main()
{
int i, n, k=0;
scanf("%d", &n);
for(i=1; i<=n; i++)
if(isprime(i)) {
k++;
if(k == 8) {
printf("%5d\n", i);
k=0;
} else printf("%5d", i);
}
return 0;
}
7-13 猜数字游戏(分数 15)
猜数字游戏是令游戏机随机产生一个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”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int i, a, n, num = 0, t;
scanf("%d %d", &a, &n);
if (n == 0 || n <= 0) {
printf("Game Over\n");
return 0;
}
for(i = 1; ;i++) {
scanf("%d", &t);
num++;
if (num > n || t < 0) {
printf("Game Over\n");
return 0;
}
if (t > a) printf("Too big\n");
if (t < a) printf("Too small\n");
if (t == a && num == 1) {
printf("Bingo!\n");
break;
}
if (t == a && num > 1 && num <= 3) {
printf("Lucky You!\n");
break;
}
if (t == a && num > 3 && num <= n) {
printf("Good Guess!\n");
break;
}
}
return 0;
}
7-14 外星人的一天(分数 15)
地球上的一天是 24 小时。但地球上还有一些精力和勤奋度都远超一般人的大神级人物,他们的“一天”是以 48 小时为周期运转的,这种人被人们尊称为“外星人”。比如普通人的周一早 8:30 是外星人的周一早 4:15;普通人的周二早 9:21 是外星人的周一下午 4:40 —— 对外星人而言,一周的工作时间只有三天(即普通人的周一至周六),周日他们会蒙头大睡恢复体力,时间对他们是没有意义的。
在外星人眼里,地球人的时钟对他们而言实在是太不方便了。本题就请你为外星人们实现一款专用时钟。
输入格式:
输入在一行中给出一个不超过 10 的正整数 N,随后 N 行,每行给出一个地球人的时刻,格式为:Day hh:mm
,其中Day
是 [0,6] 区间内的整数,顺序代表周日至周六;hh
是 24 小时制的小时数,是 [0,23] 区间内的整数;mm
是分钟数,是 [0,59] 区间内的整数。
输出格式:
对输入的每一行地球人时刻,输出对应的外星人时间,格式与输入相同。其中Day
在 [0,3] 区间内,对应周日到周三;分钟数若不是整数,则向下取整。注意:由于周日的时间对外星人没有意义,所以直接输出地球人的时间即可。
输入样例:
3
1 08:30
2 09:21
0 21:07
输出样例:
1 04:15
1 16:40
0 21:07
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main(){
int day, d, h, m;
scanf("%d", &day);
while(day--) {
scanf("%d %02d:%02d", &d, &h, &m);
if(d == 0) {
printf("%d %02d:%02d\n", d, h, m);
continue;
} else if (d % 2 == 1) {
d = d/2 + 1;
} else {
d = d/2;
h += 24;
}
m = ((h % 2)*60 + m) / 2;
h /= 2;
printf("%d %02d:%02d\n", d, h, m);
}
return 0;
}
7-15 整数的分类处理(分数 15)
给定 N 个正整数,要求你从中得到下列三种计算结果:
- A1 = 能被 3 整除的最大整数
- A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数
- A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)
输入格式:
输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。
输出格式:
在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE
。
输入样例 1:
8
5 8 7 6 9 1 3 10
输出样例 1:
9 3 6.5
输入样例 2:
8
15 18 7 6 9 1 3 10
输出样例 2:
18 3 NONE
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int i, n, m, a1=0, a2=0, cnt3=0;
double sum=0.0;
scanf("%d", &n);
for(i=0; i<n; i++) {
scanf("%d", &m);
if(m%3 == 0) {
if(a1<m) a1=m;
}
else if(m%3 == 1)
a2++;
else if(m%3 == 2) {
cnt3++;
sum += m;
}
}
if(a1) printf("%d ", a1);
else printf("NONE ");
if(a2) printf("%d ", a2);
else printf("NONE ");
if(cnt3) printf("%.1f", sum/cnt3);
else printf("NONE");
return 0;
}