程序设计入门——C语言(翁凯老师)& 中M2018秋C入门和进阶练习(基础部分)


  • 输出“Hello World”(mooc第一周编程练习)

# 定义main函数,如果定义为 int型的函数,记得要有返回值0,如果定义为void则不需要返回值。

tip1:关于int main() 和 void main()

// 输出“Hello World”


#include<stdio.h>
int main(){
printf("Hello World");
return 0;
}

 

 

  • 逆序的三位数(5分)(mooc第二周编程练习)

题目内容:

逆序的三位数:

程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

提示:用%10可以得到个位数,用/100可以得到百位数...。将这样得到的三个数字合起来:百位*100+十位*10+个位,就得到了结果。 

注意:除了题目要求的输出,不能输出任何其他内容,比如输入时的提示,输出时的说明等等都不能。这道题目要求输出逆序的数字,程序就只能输出这个数字,除此之外任何内容都不能输出。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出逆序的数。

输入样例:

123

输出样例:

321

时间限制:500ms内存限制:32000kb
 
// 逆序三位数

#include <stdio.h>
int main(){
    int num, ones, tens, hundreds;
    scanf("%d", &num);
    ones = num%10;
    tens = (num-ones)%100/10;
    hundreds = (num-ones-tens)/100;
    printf("%d",ones*100+tens*10+hundreds);
    return 0;
}

#逆序三位数利用数组方法解答

// 逆序三位数(数组)
// %s和%d输出结果相同?

#include<stdio.h>
int main(){
    char a[3];
    scanf("%s", a);
    for (int i=strlen(a)-1;i>=0;i--){
        printf("%c", a[i]);
    }
    return 0;
}

 

  • 时间换算(5分) (mooc第三周编程练习)

题目内容:

UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。

有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到2359以外的输入数据。

你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。

提醒:要小心跨日的换算。

 输入格式:

一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。

 输出格式:

一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。

 输入样例:

803

 输出样例:

3

时间限制:500ms内存限制:32000kb
// 题目没有说明是否有1190这样的输入,故加入了一个if判别式,来剔除错误输入

// 时间换算

#include<stdio.h>
int main(){
    int BJT, temp;
    scanf("%d", &BJT);
    if (BJT%100>59){
        temp = BJT%100;
        temp -=60;
        BJT = (BJT/100+1)*100 + temp;
    } 
    BJT -= 800;
    if (BJT<0) BJT += 2400;
    printf("%d", BJT);
    return 0;
}
  • 分队列(5分)(mooc第三周编程练习)

题目内容:

班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一 步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成 了一列,同学按身高从1到n编号,你能告诉我最后哪些编号的同学站在了第一列么? 

输入格式:

输入一个正整数n,表示班级的人数。

输出格式:

按顺序输出所有在第一列的同学对应的编号,每两个编号之间用一个空格隔开,最后一个编号后面没有空格。

输入样例:

11

输出样例:

1 3 5 7 9 11

时间限制:500ms内存限制:32000kb
// 分队列

// 给出一个整数n,输出1到n之间的奇数

#include <stdio.h>

int main()

{
    int n, i=1;
    scanf("%d", &n);
    for (; i<=n; i+=2){
        if (i+1 ==n|| i==n) printf("%d", i);
        else printf("%d ", i);
    }
    return 0;
}
  • 奇偶个数(5分)(mooc第四周编程练习)

题目内容:

你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。 

输入格式:

一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。

输出格式:

两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。

输入样例:

9 3 4 2 5 7 -1 

输出样例:

4 2

时间限制:500ms内存限制:32000kb
// 奇偶个数

#include<stdio.h>
int main(){
    int N, count_double=0, count_single=0;
    scanf("%d", &N);
    while(N != -1){
        if (N%2 ==0) count_double +=1;
        else count_single +=1;
        scanf("%d", &N);
    }
    printf("%d %d", count_single, count_double);
    return 0;
}
  • 数字特征值(5分)(mooc第四周编程练习)

 

题目内容:

对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

这里的计算可以用下面的表格来表示:

 

数字

3

4

2

3

1

5

数位

6

5

4

3

2

1

数字奇偶

数位奇偶

奇偶一致

0

0

1

1

0

1

二进制位值

32

16

8

4

2

1

 

你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

输入格式:

一个非负整数,整数的范围是[0,1000000]。 

输出格式:

一个整数,表示计算结果。

输入样例:

342315 

输出样例:

13

时间限制:500ms 内存限制:32000kb
 
// 数字特征值

#include<stdio.h>
#include<math.h>
int main(){
    int N, digit=0, temp;
    scanf("%d", &N);
    temp = 1;
// 计算出输入数字位数
    while(N/temp!=0) {
        digit++;
        temp = pow(10, digit);
    }
    int sum = 0;
// 比较位数和位值的关系,相同二进制值位1,不同值为0,并将结果转化成10进制赋予sum
    for (int i=digit;i>=1;i--){
        temp = pow(10, i-1);
        if (i%2 == (N/temp)%2) sum += pow(2, i-1);
        N %= temp;
    }
    printf("%d", sum);
    return 0;
}

 

  • 素数和(5分)(mooc第五周编程练习)

 

题目内容:

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。

现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

输入格式:

两个整数,第一个表示n,第二个表示m。

输出格式:

一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

输入样例:

2 4

输出样例:

15

时间限制:500ms内存限制:32000kb
// 素数和(自己写的)

#include<stdio.h>
int main(){
    int M, N, sum=0, count =0;
    scanf("%d %d", &M, &N);
    for (int i=2;;i++){
        for (int j=1;j<=i;j++){
            if (i%j==0&&j!=1&&j!=i) break;
            if (j == i){
                count +=1;
                if(M<=count&& count<=N) sum += i;
            } 
        }
        
        if(count>200) break;
    }
    printf("%d", sum);
    return 0;
}

 

// 传统判断素数的方法(翁凯老师)
#include<stdio.h>
// 在已知的素数表内判断新数字是否为素数
int isPrime(int x, int knowPrimes[], int numbeOfKnownPrimes){
    int ret = 1;
    int i;
    for ( i=0; i<numbeOfKnownPrimes; i++ ){
        if ( x % knowPrimes[i] == 0){
            ret = 0;
            break;
        }
    }
    return ret;
}
int main(){
// const int number = 100;
// 网页开发环境中,这条语句不能通过
    int prime[200] = {2};
    int count = 1;
    int i = 3;

    while ( count < 200 ){
        if ( isPrime(i, prime, count )) {
            prime[count++] = i;            // 在素数表内判断后,由返回结果判断是否将新数字加入到素数表内
        }
        i++;
    }
    // 输出素数表,每五个素数换行一次
    // for ( i=0; i<200; i++){
    //     printf("%d", prime[i]);
    //     if ( (i+1)%5 ) printf("\t");
    //     else printf("\n");
    // }
    int start, end, sum=0;
    scanf("%d %d", &start, &end);
    for (int k=start-1;k<=end-1;k++) sum += prime[k];
    printf("%d", sum);
    return 0;
}

 

  • 念整数(5分)(mooc第五周编程练习)

 

题目内容:

你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。

如输入1234,则输出:

yi er san si

注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:

fu er san si yi

输入格式:

一个整数,范围是[-100000,100000]。

输出格式:

表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。

输入样例:

-30

输出样例:

fu san ling

时间限制:500ms内存限制:32000kb
// 念整数

#include<stdio.h>
#include<math.h>
int main(){
    int N, i, val, temp=1, digit=0;
    scanf("%d", &N);
// 计算该整数的位数
    while(N/temp!=0){
        digit++;
        temp = pow(10, digit);
    }
// 负整数需要特殊处理
    if (N<0) {
        printf("fu ");
        N = -N;
    }
// 整数为零需要特殊处理
    if (digit ==0) printf("ling");
// 念整数核心实现部分
    for (int j=digit-1;j>=0;j--){
        temp = pow(10, j);
        val = N / temp;
        switch (val){
            case 0:printf("ling"); break;
            case 1:printf("yi"); break;
            case 2:printf("er"); break;
            case 3:printf("san"); break;
            case 4:printf("si"); break;
            case 5:printf("wu"); break;
            case 6:printf("liu"); break;
            case 7:printf("qi"); break;
            case 8:printf("ba"); break;
            case 9:printf("jiu"); break;
        }
        N -= temp * val;
        if (j!=0) printf(" ");return 0;
}
  •  7-1 重要的话说三遍 (5 分)(PTA)

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

// 重要的话说三遍

#include <stdio.h>

int main(int argc, char **argv) {
    for(int i=0; i<3; i++){
        printf("I'm gonna WIN!\n");
      }
    return 0;
}
  • 7-2 I Love GPLT (5 分)(PTA)

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了。

所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。

// I Love GPLT

#include <stdio.h>
int main()
{
    char *p = "I Love GPLT";
    while(*p){
        printf("%c\n", *p++);
    }
    return 0;
}
  • 7-3 输出带框文字 (5 分)(PTA)

本题要求编写程序,输出指定的带框文字。

输入格式:

本题无输入

输出格式:

按照下列格式输出带框文字。

************ 
 Welcome
************
// 输出带框文字

#include<stdio.h>
int main(){
    char a[]="************";
    char b[]="Welcome";
// 标准输出可以控制第二行的Welcome占用10个位置,且靠右输出
    printf("%s\n%9s\n%s",a, b, a);
    return 0;
}
  • 7-4 输出菱形图案 (5 分)(PTA)

本题要求编写程序,输出指定的由“A”组成的菱形图案。

输入格式:

本题无输入

输出格式:

按照下列格式输出由“A”组成的菱形图案。

  A
A   A
  A 
 
// 输出菱形图案

#include<stdio.h>
void diamond(int n){
    for(int i=1; i<=n; i++){
        if (i%2==1){
            printf("  A\n");
        }
        else {
            printf("A   A\n");
        }
    }
}

int main(){
    diamond(3);
    return 0;
}
  • 7-5 输出倒三角图案 (5 分)(PTA本题要求编写程序,输出指定的由“*”组成的倒三角图案。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出由“*”组成的倒三角图案。

* * * *

 * * *

  * *

   *

// 输出倒三角形图案

#include<stdio.h>
// 能生成N阶倒三角形的一个函数,主要分成三部分
void trangle(int N){
    for(int i=N; i>0; i--){
// 第一个for,输出每一行倒三角形前面的空格
        for(int p=1; p<=N-i; p++){
            printf(" ");
        }
// 第二个for,输出每一行除最后一个的※号
        for (int q=1; q<=i-1; q++){
            printf("* ");
        }
// 输出每行最后一个※号
        printf("*\n");
    }
}
int main(){
    trangle(5);
    return 0;
    
}
  •  7-6 厘米换算英尺英寸 (15 分)(PTA)

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:

输入在一行中给出1个正整数,单位是厘米。

输出格式:

在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:

170

输出样例:

5 6
// 厘米换算英尺尺寸

#include<stdio.h>

int main(){
    int length, foot, inch;
    double foot_dot;
    scanf("%d", &length);
    foot = length/30.48;
    foot_dot = length/30.48;
    inch = (foot_dot-foot)*12;
    printf("%d %d", foot, inch);
    return 0;
}
  • 7-7 计算摄氏温度 (10 分) (PTA)

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F32)/9。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出一个华氏温度。

输出格式:

在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样例:

150

输出样例:

Celsius = 65
// 计算摄氏温度

#include<stdio.h>

int main(){
    int C_temper, F_temper;
    scanf("%d", &F_temper);
    C_temper = 5 * (F_temper - 32) / 9;
    printf("Celsius = %d\n", C_temper);
    return 0;
    
}
  • 7-8 是不是太胖了 (5 分) (PTA)

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤是公斤的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)

输入格式:

输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。

输出格式:

在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。

输入样例:

169

输出样例:

124.2

// 是不是太胖了

#include<stdio.h>

int main(){
    int H;
    double W;
    scanf("%d", &H);
    W = (H -100)*0.9*2;
    printf("%.1lf", W);
    return 0;
}
  • 7-9 求整数均值 (10 分)(PTA)

本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出4个整数,其间以空格分隔。

输出格式:

在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。

输入样例:

1 2 3 4

输出样例:

Sum = 10; Average = 2.5

// 求整数均值

#include<stdio.h>

int main(){
    int a, b, c, d, sum=0;
    double Average;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    sum = a + b +c + d;
    Average = sum/4.0;
    printf("Sum = %d; Average = %.1lf\n", sum, Average);
    return 0;
}
  • 7-10 算术入门之加减乘除 (10 分)(PTA)

对于输入的两个整数,按照要求输出其和差积商。

输入格式:

在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。

输出格式:

共四行,格式是:

[a] + [b] = [a+b]

[a] - [b] = [a-b]

[a] * [b] = [a*b]

[a] / [b] = [a/b]

其中,带有方括号的内容(如[a][b][a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。

并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。

提示:注意表达式中的空格。

输入样例1:

6 3

输出样例1:

6 + 3 = 9

6 - 3 = 3

6 * 3 = 18

6 / 3 = 2

输入样例2:

8 6

输出样例2:

8 + 6 = 14

8 - 6 = 2

8 * 6 = 48

8 / 6 = 1.33

// 算术入门之加减乘除

#include<stdio.h>
void basic_fun();

void basic_fun(int Num1, int Num2){
    int residual;
    residual = Num1%Num2;
    printf("%d + %d = %d\n", Num1, Num2, Num1 + Num2);
    printf("%d - %d = %d\n", Num1, Num2, Num1 - Num2);
    printf("%d * %d = %d\n", Num1, Num2, Num1 * Num2);
    if (residual != 0) printf("%d / %d = %.2lf\n", Num1, Num2, Num1/(double)Num2);
    else printf("%d / %d = %d\n", Num1, Num2, Num1/Num2);
}
int main(){
    int Num1, Num2;
    scanf("%d%d", &Num1, &Num2);
    basic_fun(Num1, Num2);
    return 0;
}
  • 7-11 计算平均分 (5 分)(PTA)

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。

输入格式:

本题无输入

输出格式:

按照下列格式输出结果:

math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩

// 计算平均分

#include<stdio.h>
int main(){
    int math = 87, english = 72, computer = 93, avg;
    avg = (math + english + computer) / 3;
    printf("math = %d, eng = %d, comp = %d, average = %d\n", math, english, computer, avg);
    return 0;
}
  • 7-12 日期格式化 (5 分)(PTA)

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:

在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:

03-15-2017

输出样例:

2017-03-15

// 日期格式化

#include<stdio.h>
int main(){
    int day, month, year;
    scanf("%d-%d-%d", &month, &day, &year);
    printf("%d-%02d-%02d",year, month, day);
    
}
  • 7-13 后天 (5 分)(PTA)

如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

输入格式:

输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:

在一行中输出D天的后天是星期几。

输入样例:

3

输出样例:

5
// 后天(The day after tomorrow)

#include<stdio.h>
int main(){
    int N;
    scanf("%d", &N);
    if (N==5) printf("7");
    else printf("%d", (N+2)%7);
    return 0;
}
  • 7-14 然后是几点 (15 分)(PTA)

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。

输入格式:

输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。

输出格式:

输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310
// 然后是几点(化整为零再化整法)

#include<stdio.h>
int main(){
    int Time_start, Time_end, Time_minute, Time_passed;
    scanf("%d%d", &Time_start, &Time_passed);
// 将现在时间全部化成分钟
    Time_minute = Time_start/100 * 60 + Time_start % 100;
// 加上经过的时间
    Time_minute += Time_passed;
// 再化成小时分钟的形式
    Time_end = Time_minute/60 * 100 + Time_minute % 60;
    printf("%d\n", Time_end);
    return 0;
}
// 然后是几点(直接计算法)

#include<stdio.h>
int main(){
    printf("%d", Time_minute);
    int Time_now, passed;
    scanf("%d %d", &Time_now, &passed);
// 直接将经过的时间加到现在的时间上
    Time_now = Time_now + (passed/60)*100 + passed%60;
// 如果加的是正向时间,考虑进位问题
    if (Time_now%100 >= 60 && passed>0) {
        Time_now += 40;
    }
 // 如果加的是反向时间,考虑借位问题
    else if (Time_now%100 >= 60 || passed <-40 && passed<0) {
        Time_now -= 40;
    }
    printf("%d", Time_now);
    return 0;
}
  • 7-15 BCD解密 (10 分)

 

 BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

 

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12
// BCD解密
// 本题中将错误的BCD十进制数->二进制->十六进制->BCD十进制这个过程,由于输入范围是
// 0~153 对应的十六进制范围0x00~0x99,恰好可以利用BCD十进制数对16整除、求余的
// 结果拿过来成为正确的BCD十进制输出

#include<stdio.h>
int main(){
    int n,a,b;
    scanf("%d",&n);
    a = n/16;
    b = n%16;
    printf("%d",a*10+b);
    return 0;
}
  • 7-16 计算符号函数的值 (10 分)(PTA)

对于任一整数n,符号函数sign(n)的定义如下:

 

请编写程序计算该函数对任一输入整数的值。

输入格式:
输入在一行中给出整数n。

输出格式:
在一行中按照格式"sign(n) = 函数值"输出该整数n对应的函数值。

输入样例1:
10
输出样例1:
sign(10) = 1
输入样例2:
0
输出样例2:
sign(0) = 0
输入样例3:
-98
输出样例3:
sign(-98) = -1

// 计算符号函数的值

#include<stdio.h>
int main(){
    int N;
    scanf("%d", &N);
    if(N>0){
        printf("sign(%d) = 1\n", N);
    }
    else if(N==0){
        printf("sign(%d) = 0\n", N);
    }
    else{
        printf("sign(%d) = -1\n", N);
    }
    return 0;
}
  • 7-17 成绩转换 (15 分)(PTA)

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在一行中给出一个整数的百分制成绩。

输出格式:
在一行中输出对应的五分制成绩。

输入样例:
90
输出样例:
A

// 成绩转换

#include<stdio.h>
int main(){
    int score;
    scanf("%d", &score);
    switch(score/10){
        case 10:
        case 9: printf("A\n");break;
        case 8: printf("B\n");break;
        case 7: printf("C\n");break;
        case 6: printf("D\n");break;
        case 5: 
        case 4: 
        case 3: 
        case 2: 
        case 1: 
        case 0: printf("E\n");break;
        default: printf("Error!");break;
    }
    return 0;
}
  • 7-18 出租车计价 (15 分)(PTA)

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

起步里程为3公里,起步费10元;
超起步里程后10公里内,每公里2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:
2.6 2
输出样例1:
10
输入样例2:
5.1 4
输出样例2:
14
输入样例3:
12.5 9
输出样例3:
34

// 出租车计价

#include<stdio.h>
int main(){
    double Distance, fee;
    int Waiting_time, fee_int;
    scanf("%lf%d", &Distance, &Waiting_time);
//  起步范围内计费+等候时间计费
    if (Distance<=3){
        fee = 10 + Waiting_time / 5 * 2;
    }
// 十公里内计费+等候时间计费
    else if(Distance<=10){
        fee = 10 + (Distance-3)*2 + Waiting_time / 5 * 2;
    }
// 十公里以上计费+等候时间计费
    else{
        fee = 10 + 14 + (Distance-10)*3 + Waiting_time / 5 * 2;
    }
// 最终计费四舍五入
    fee_int = (int)fee;
    if(fee-fee_int>=0.5){
        printf("%d\n", fee_int+1);
    }
    else{
        printf("%d\n", fee_int);
    }
    return 0;
}
  •  7-19 计算天数 (15 分)(PTA)

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:
输入在一行中按照格式"yyyy/mm/dd"(即"年/月/日")给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:
在一行输出日期是该年中的第几天。

输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62

// 计算天数

#include<stdio.h>
int main(){
    int year, month, day, day_total=0, Feb;
    scanf("%d/%d/%d", &year, &month, &day);
// 判断是否是闰年
    if ((year%4 ==0 && year%100 !=0)||year% 400 ==0){
        Feb = 29;
    }else{
        Feb = 28;
    }
// 便利循环1到12个月,把每个月的天数加在总天数上
    for (int i=1, day_per_month; i<=month; i++){
        if (i<month){
            if (i==1||i==3||i==5||i==7||i==8||i==10||i==12){
                day_per_month = 31;
            }else if(i ==2){
                day_per_month = Feb;
            }else{
                day_per_month = 30;
            }
            day_total += day_per_month;
        }
        if (i == month){
            day_total += day;
        }
    }
    printf("%d\n", day_total);
    return 0;
}

  • 7-20 简单计算器  (20)(PTA)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号"="说明输入结束。

输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息"ERROR"。

输入样例:
1+2*10-10/2=
输出样例:
10

// 简单计算器

#include<stdio.h>
int main(){
    char math;
    int a, b, flag=1;
    scanf("%d", &a);
    while(scanf("%c", &math)&&flag){
        switch(math){
        case '+':scanf("%d", &b); a += b; break;
        case '-':scanf("%d", &b); a -= b; break;
        case '*':scanf("%d", &b); a *= b; break;
        case '/':scanf("%d", &b); if(b == 0) {
            printf("ERROR");
            flag =0;
            break;
        }else {
            a /= b;
            break;
        }
        case '=': printf("%d", a); flag=0; break;
        default : printf("ERROR"); flag=0; break;
        }
    }
    return 0;
}
  • 7-21 超速判断 (10 分)(PTA)

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示"Speeding",否则显示"OK"。

输入格式:
输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:
在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。

输入样例1:
40
输出样例1:
Speed: 40 - OK
输入样例2:
75
输出样例2:
Speed: 75 - Speeding

// 超速判断

#include<stdio.h>
int main(){
    int Speed;
    scanf("%d", &Speed);
    if(Speed>60){
        printf("Speed: %d - Speeding\n", Speed);
    }else{
        printf("Speed: %d - OK\n", Speed);
    }
    return 0;
}
  • 7-22 用天平找小球 (10 分)(PTA)

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:
在一行中输出唯一的那个不一样的球。

输入样例:
1 1 2
输出样例:
C

// 用天平找小球

#include<stdio.h>
int main(){
    int A, B, C;
    scanf("%d%d%d", &A, &B, &C);
    if(A == B){
        printf("C");
    }else if(A == C){
        printf("B");
    }else{
        printf("A");
    }
    return 0;
}
  • 7-23 分段计算居民水费 (10 分)(PTA)

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。

输入格式:
输入在一行中给出非负实数x。

输出格式:
在一行输出应交的水费,精确到小数点后2位。

输入样例1:
12
输出样例1:
16.00
输入样例2:
16
输出样例2:
22.50

// 分段计算居民水费

#include<stdio.h>
int main(){
    double water_T, water_P;
    scanf("%lf", &water_T);
    if(water_T<=15){
        water_P = water_T *4 /3;
    }else{
        water_P = water_T *2.5 - 17.5;
    }
    printf("%.2lf", water_P);
    return 0;
}
  • 7-24 猜数字游戏 (15 分)(PTA)

猜数字游戏是令游戏机随机产生一个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!

// 猜数字游戏

#include<stdio.h>
int main() {
    int rand_num, guess_num, N;
    scanf("%d %d", &rand_num, &N);
    for(int i = 1; i <= N; i++) {
        scanf("%d", &guess_num);
// 猜中时,根据猜测次数输出结果
        if (guess_num == rand_num) {
            switch(i) {
                case 1: printf("Bingo!\n"); break;
                case 2:
                case 3: printf("Lucky You!\n"); break;
                default: printf("Good Guess!\n"); break;
            }
            goto exit;
// 没猜中时,根据二者大小进行输出,并经行下一次判断
        }else if (guess_num < rand_num && guess_num > 0) {
            printf("Too small\n");
            if (i == N) {
                printf("Game Over\n");
                break;
            }
        }else if (guess_num > rand_num) {
            printf("Too big\n");
            if (i == N) {
                printf("Game Over\n");
                break;
            }
        }else if (guess_num < 0 || i == N) {
            printf("Game Over\n");
            break;
        }
    }
    exit:
    return 0;
}
  • 7-25 求奇数和 (15 分)(PTA)

本题要求计算给定的一系列正整数中奇数的和。

输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

输出格式:
在一行中输出正整数序列中奇数的和。

输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116

// 求奇数和

#include<stdio.h>
int main(){
    int num, sum=0;
    for(int i=0;;i++){
        scanf("%d", &num);
        if(num<=0){
            printf("%d\n", sum);
            break;
        }else if(num%2!=0) {
            sum += num;
        }
    }
    return 0;
}
  • 7-26 最大公约数和最小公倍数 (15 分)(PTA)

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

 
            
// 求最大公约数和最小公倍数

#include<stdio.h>
int Maxcommondivisor();
int Mincommonmutiple();
// 最大公约数
int Maxcommondivisor(int m, int n){
    int rem;
    while(n>0){
        rem = m%n;
        m = n;
        n = rem;
    }
    return m;
}
// 最小公倍数
int Mincommonmutiple(int m, int n, int d){
    int a;
    a = m * n / d;
    return a;
}
int main(){
    int m, n, d;
    scanf("%d%d", &m, &n);
    printf("%d ", d=Maxcommondivisor(m, n));
    printf("%d\n", Mincommonmutiple(m, n, d));
    return 0;
    
    
}
 
            
  • 7-27 兔子繁衍问题 (15 分)(PTA)

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:
输入在一行中给出一个不超过10000的正整数N。

输出格式:
在一行中输出兔子总数达到N最少需要的月数。

输入样例:
30
输出样例:
9

// 兔子繁衍问题

#include<stdio.h>
int Fibonacci();
// 兔子繁衍问题可以等效的看作是斐波那契数列问题
int Fibonacci(int N){
    if(N ==1|| N ==2){
        return 1;
    }
    else{
        return Fibonacci(N-2) + Fibonacci(N-1);
    }
}
int main(){
    int number, month;
    scanf("%d", &number);
    for (int i=1;;i++){
        if(Fibonacci(i)>=number){
            printf("%d\n", i);
            break;
        }
    }
    return 0;
    
}
  •  7-28 求整数的位数及各位数字之和 (15 分)(PTA)

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:
输入在一行中给出一个不超过10的9次方
​​的正整数N。

输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:
321
输出样例:
3 6

// 求整数的位数及各位数字之和

#include<stdio.h>
#include<math.h>
int main(){
    int N, i=0, temp = 1, sum = 0;
    scanf("%d", &N);
// 求输入整数的位数
    while(N/temp){
        i++;
        temp = pow(10,i);
    }
// 求各个位数之和
    for (int j=i-1;j>=0;j--){
        temp = pow(10, j);
        sum += N/temp;
        N %= temp;
    }
    printf("%d %d", i, sum);
    return 0;
}

 

  • 7-29 二分法求多项式单根 (20 分)(PTA)

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。
本题目要求编写程序,计算给定3阶多项式

f(x)=a3x3+a2x2+a1x+a0

​​ 在给定区间[a,b]内的根。输入格式:输入在第1行中顺序给出多项式的4个系数

aaaa0
,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33

// 123
  • 7-30 念数字 (15 分)(PTA)

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

输入样例:
-600
输出样例:
fu liu ling ling

// 念数字

#include<stdio.h>
#include<math.h>
int main(){
    int N, M, i=0, digit=0, temp, pow1;
    char *a[10] = {"ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    scanf("%d", &N);
    M = N;
// 读取数字位数   
    while(M!=0){
        M /= 10;
        digit++;
    }
    
    if(N == 0) digit = 1;
    if(N < 0){
        printf("fu ");
        N *= -1;
    }
// 循环输出每位对应的汉字   
    for (i=digit;i>0;i--){
        pow1 = pow(10,i-1);
        temp = N/pow1;
        if (i==1) printf("%s", a[temp]);
        else printf("%s ", a[temp]);
        N %= pow1;
    }
    return 0;
}
  • 7-31 掉入陷阱的数字 (15 分)(PTA)

// 掉入陷阱的数字

#include<stdio.h>
int number_trap(int N){
    int sum=0, result;
    while(N){
        sum += N % 10;
        N /= 10;
    }
    result = sum * 3 + 1;
    return result;
}
int main(){
    int N, temp, result;
    scanf("%d", &N);
    temp = N;
    for (int i=1;;i++){
        result = number_trap(temp);
        printf("%d:%d\n", i, result);
        if (temp == result) break;
        temp = result;
    }
    return 0;
}
  •  7-32 求交错序列前N项和 (15 分)(PTA)

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,结果保留三位小数。

输入样例:
5
输出样例:
0.917

// 求交错序列前N项和

#include<stdio.h>
#include<math.h>
int main() {
    int N;
    scanf("%d", &N);
    float sum = 0;
    for (float j = 1; j <= N; j++) {
        sum += (j/(2*j-1))*pow(-1, j+1);
    }
    printf("%.3f\n", sum);
    return 0;
}
  • 7-33 统计素数并求和 (20 分)(PTA)

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:
10 31
输出样例:
7 143

// 统计素数并求和

#include<stdio.h>
const int maxNumber = 501;
int main(){

    int isPrime[maxNumber];
    int i;
    int x;
    // 定义一个素数表,初始化假设isPrime表内数字均为素数
    for ( i = 0; i<maxNumber; i++ ){
        if (i == 1 || i == 0 ) isPrime[i] = 0;
        else isPrime[i] =1;
    }
    // 从较小的数字开始,排除个位素数的倍数,标记为0,遍历顺序由小到大
    for ( x=2; x<maxNumber; x++){
        if ( isPrime[x] ){
            for ( i=2; i*x<maxNumber; i++){
                isPrime[i*x] = 0;
            }
        }
    }
    int m, n, sum=0, count=0;
    scanf("%d %d", &m, &n);
    // 输出标记为非零的数组下标
    for ( i=m; i<=n; i++){
        if ( isPrime[i] ) {
            sum += i;
            count++;
        }
    }
    printf("%d %d\n", count, sum);
    return 0;
}
  • 7-34 求分数序列前N项和 (15 分)(PTA)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:
20
输出样例:
32.66

// 求分数序列前N项和

#include<stdio.h>
int main() {
    int N;
    double sum = 0, num_up = 2.0, num_down = 1.0;
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        sum += num_up/num_down;
        num_up += num_down;
        num_down = num_up - num_down;
    }
    printf("%.2f\n", sum);
    return 0;
}
  • 7-35 猴子吃桃问题 (15 分)(PTA)

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:
输入在一行中给出正整数N(1<N≤10)。

输出格式:
在一行中输出第一天共摘了多少个桃子。

输入样例:
3
输出样例:
10

// 猴子吃桃问题

#include<stdio.h>
int main() {
    int N = 0, num = 1;
    scanf("%d", &N);
    for (int i = N-1; i > 0; i--) {
        num = (num+1)*2;
    }
    printf("%d\n", num);
    return 0;
}
  • 7-36 韩信点兵 (10 分)(PTA)

在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。

输入格式:
本题无输入

输出格式:
输出韩信至少拥有的士兵人数。

// 韩信点兵

#include<stdio.h>
int main() {
    int N;
    for (int i = 1;;i++) {
        if(i%5 == 1 && i%6 == 5 && i%7 == 4 && i%11 == 10) {
            printf("%i\n", i);
            break;
        }
    }
    return 0;
}
  • 7-37 输出整数各位数字 (15 分)(PTA)

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:
输入在一行中给出一个长整型范围内的非负整数。

输出格式:
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:
123456
输出样例:
1 2 3 4 5 6

// 输出整数各位数字

#include<stdio.h>
int main() {
    int N, mask = 1, temp, t;
    scanf("%d", &N);
    t = N;
    while(t > 9) {
        t /= 10;
        mask *= 10;
    }
// 这里采用mask作为循环的判定标识,是为了避免出现N=100这种情况,不能完全
// 输出每一位数字
    do {
        temp = N / mask;
        printf("%d ", temp);
        N %= mask;
        mask /= 10;

    }while(mask > 0);
    return 0;

}

 

  • 7-38 支票面额 (15 分)(PTA)

一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:
输入在一行中给出小于100的正整数n。

输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution

// 支票面额
// Bad solution

#include<stdio.h>
int main(){
    int X, Y, N, flag = 1;
    scanf("%d", &N);
    for (int i=0;i<=100 && flag;i++){
        for (int j=1;j<=100 && flag ;j++){
            if((2*i == j && 2*j == i-N )||(2*i+1 == j && 2*j-100== i-N)||
            (2*i+2==j && 2*j -100==i+100-N)){
                flag = 0;
                printf("%d.%d\n", i,j);
            }
        }
    }
    if (flag) printf("No Solution\n");
    return 0;
}
  •  7-39 龟兔赛跑 (20 分)(PTA)

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:
输入在一行中给出比赛时间T(分钟)。

输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:
242
输出样例:
@_@ 726

// 龟兔赛跑
// 借鉴网上的思路,原来的方法太复杂了

#include<stdio.h>
int main() {
    int rabbit = 0, tor = 0, T, rab_run = 1, t = 10;
    scanf("%d", &T);
// 龟兔赛跑的核心
    while(t <= T){
        tor = 3 * t;
        rabbit += rab_run * 90;
        if(rabbit > tor){
            rab_run = 0;
            t += 20;
        }else
            rab_run = 1;
        t += 10;
    }
    tor = 3 * T;
// 例如当比赛时间为44分钟,兔子还没有超过乌龟,但由于while循环里最后一行t+=10
// 导致t=50 循环终止,为了补偿兔子的4分钟,特设此条件语句
    if (rab_run)
        rabbit = rabbit + (10-(t-T))*9;
    
    if(rabbit > tor)
        printf("^_^ %d\n", rabbit);

    else if(tor > rabbit)
        printf("@_@ %d\n", tor);

    else
        printf("-_- %d\n", rabbit);
    return 0;
}
  • 7-40 到底是不是太胖了 (10 分)(PTA)

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。

输入格式:
输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。

输出格式:
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。

输入样例:
3
169 136
150 81
178 155
输出样例:
You are wan mei!
You are tai shou le!
You are tai pang le!

// 到底是不是太胖了?

#include<stdio.h>
#include<math.h>
void beauty(int h, int w) {
    double standard_w, temp_1, temp_2;
    standard_w = (h-100)*0.9;
    temp_1 = w/2.0 - standard_w;
    temp_2 = standard_w*0.1;
    
    if(fabs(temp_1) < temp_2)
        printf("You are wan mei!\n");
        
    else if(w/2.0 > standard_w)
        printf("You are tai pang le!\n");
        
    else 
        printf("You are tai shou le!\n");
}
int main() {
    int N, H, W;
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        scanf("%d %d", &H, &W);
        beauty(H, W);
    }

    return 0;
}

 

 
 
 
 
 
 
 
 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM