【PTA-C语言】编程练习3 - 循环结构Ⅰ
- 如果代码存在问题,麻烦大家指正 ~ ~
- 有帮助麻烦点个赞 ~ ~
编程练习3 - 循环结构(1~8)
- 7-1 统计整数的位数(分数 15)
- 7-2 输出闰年(分数 15)
- 7-3 求分数序列前N项和(分数 15)
- 7-4 求给定精度的简单交错序列部分和(分数 15)
- 7-5 最佳情侣身高差(分数 10)
- 7-6 简写转全称(分数 15)
- 7-7 约分最简分式(分数 15)
- 7-8 猴子吃桃问题(分数 15)
7-1 统计整数的位数(分数 15)
从键盘读入一个整数,统计该数的位数。例如,输入12534,输出5;输入-99,输出2;输入0,输出1。
输入格式:
输入一个整数N(−105 ≤N≤105)。
输出格式:
在一行中按如下格式输出该数的位数。
It contains 位数 digits.
输入样例:
12534
输出样例:
It contains 5 digits.
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int n, d=0;
scanf("%d", &n);
if (n==0) d=1;
if (n<0) n=-n;
while (n!=0) {
n/=10;
d++;
}
printf("It contains %d digits.", d);
return 0;
}
7-2 输出闰年(分数 15)
输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。
输入格式:
输入在一行中给出21世纪的某个截止年份。
输出格式:
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。
输入样例1:
2048
输出样例1:
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
输入样例2:
2000
输出样例2:
Invalid year!
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
#include <math.h>
int main() {
int n, i, t = 0;
scanf("%d", &n);
if (n <= 2000 || n > 2100) {
printf("Invalid year!\n");
return 0;
}
for (i = 2001; i <= n; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
printf("%d\n", i);
t = 1;
}
}
if (t == 0) printf("None");
return 0;
}
7-3 求分数序列前N项和(分数 15)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int n, i;
double sum=0, a=1.0, b=2.0, c;
scanf("%d", &n);
for(i=1; i<=n; i++) {
sum += b/a;
c=b;
b=a+b;
a=c;
}
printf("%.2f", sum);
return 0;
}
7-4 求给定精度的简单交错序列部分和(分数 15)
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + … 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int i, flag=1;
double sum=0, n=1.0, eps;
scanf("%lf", &eps);
if (eps>=1)
printf("sum = %.6f", n);
else {
for(i=1; n>eps; i++) {
n = 1.0/(3*i-2);
sum += n*flag;
flag =- flag;
}
printf("sum = %.6f", sum);
}
return 0;
}
7-5 最佳情侣身高差(分数 10)
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。
输入格式:
输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。
输出格式:
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。
输入样例:
2
M 1.75
F 1.8
输出样例:
1.61
1.96
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include<stdio.h>
int main()
{
int n, i;
char ch, x;
double h;
scanf("%d", &n);
scanf("%c", &x);
for(i=1; i<=n; i++) {
scanf("%c %lf%c", &ch, &h, &x);
if (ch=='M') h /= 1.09;
else h *= 1.09;
printf("%.2lf\n", h);
}
return 0;
}
7-6 简写转全称(分数 15)
在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:
- 每个简写字母对应一行输出
- 若字符为
C
或c
,则该行输出"BEIJING OLYMPIC GAMES" - 若字符为
J
或j
,则该行输出"JAPAN WORLD CUP" - 若字符为
K
或k
,则该行输出"KOREA WORLD CUP" - 若为其他字符,则该行原样输出该字符。
输入格式:
输入在一行中输入若干个字符,字符之间没有空格间隔,以回车结束。
输出格式:
按题目要求产生若干行输出。
输入样例:
kijckj
输出样例:
KOREA WORLD CUP
i
JAPAN WORLD CUP
BEIJING OLYMPIC GAMES
KOREA WORLD CUP
JAPAN WORLD CUP
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include <stdio.h>
int main()
{
int ch;
while((ch=getchar()) != '\n')
if (ch=='c' || ch=='C')
printf("BEIJING OLYMPIC GAMES\n");
else if (ch=='J' || ch=='j')
printf("JAPAN WORLD CUP\n");
else if (ch=='K' || ch=='k')
printf("KOREA WORLD CUP\n");
else
printf("%c\n", ch);
return 0;
}
7-7 约分最简分式(分数 15)
分数可以表示为分子/分母
的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/
分隔,如:12/34
表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:
- 对于C语言,在
scanf
的格式字符串中加入/
,让scanf
来处理这个斜杠。 - 对于Python语言,用
a,b=map(int, input().split('/'))
这样的代码来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母
的形式表示分数。如
5/6
表示6分之5。
输入样例:
66/120
输出样例:
11/20
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include<stdio.h>
int main()
{
int i, a=0, b=0;
scanf("%d/%d", &a, &b);
for(i=b; i>1; i--)
if(a%i==0 && b%i==0){
a /= i;
b /= i;
}
printf("%d/%d", a, b);
return 0;
}
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
7-8 猴子吃桃问题(分数 15)
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
参考代码
#include<stdio.h>
int main()
{
int i, d, n=1;
scanf("%d", &d);
for(i=2; i<=d; i++)
n = (n+1)*2;
printf("%d",n);
return 0;
}