程序設計入門——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