【PTA-C语言】编程练习3 - 循环结构Ⅰ

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)

在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:

  • 每个简写字母对应一行输出
  • 若字符为Cc,则该行输出"BEIJING OLYMPIC GAMES"
  • 若字符为Jj,则该行输出"JAPAN WORLD CUP"
  • 若字符为Kk,则该行输出"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;
}

猜你喜欢

转载自blog.csdn.net/qq_45801887/article/details/134772898