1. 程式人生 > 其它 >MOOC 哈工大蘇小紅C語言 第七週練兵區——程式設計題

MOOC 哈工大蘇小紅C語言 第七週練兵區——程式設計題

技術標籤:MOOC蘇小紅C語言程式設計題

寫在前邊的話:寫作不易,有幫助到你的話麻煩點贊收藏呦。感激不盡!如有錯誤也請留言指正

點我檢視MOOC蘇小紅C語言程式設計精髓所有程式設計題

目錄

1.諧均值計算(4分)

2.輸出指定行列數的字元(4分)

3.魔術師猜數(4分)

4.計算禮炮聲響次數(4分)

5.水手分椰子(4分)

6.遞迴法計算遊戲人員的年齡(4分)

7.遞迴法計算兩個數的最大公約數(4分)

8.尋找中位數v1.0(4分)

9.還原算術表示式(4分)


1.諧均值計算(4分)

題目內容:

兩數值的諧均值可以這樣計算:首先對兩數值的倒數取平均值,最後再取倒數。編寫一個帶有兩個double引數的函式,計算這兩個引數的諧均值。函式原型為:

double Calculate(double x,double y);

程式執行結果示例1:

Input two doubles:

3 4↙

1/((1/x+1/y)/2) = 3.429

程式執行結果示例2:

Input two doubles:

6.5 3.8↙

1/((1/x+1/y)/2) = 4.796

輸入提示資訊:"Input two doubles:\n"

輸入格式:"%lf%lf"

輸出格式:"1/((1/x+1/y)/2) = %0.3f\n" (注意:等號的兩邊各有一個空格)

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>


int main() {
    double x, y;
    printf("Input two doubles:\n", &x, &y);
    scanf("%lf%lf", &x, &y);
    printf("1/((1/x+1/y)/2) = %0.3f\n", 1 / ((1 / x + 1 / y) / 2));

}
用例測試結果執行時間佔用記憶體提示得分
用例1通過1ms256kb2
用例2通過1ms256kb2

提交答案

本次得分/總分:4.00/4.00分


2.輸出指定行列數的字元(4分)

題目內容:

編寫一個函式,函式原型:void Chline(char ch, int column, int row);

該函式的3個引數是一個字元和兩個整數。字元引數是需要輸出的字元。第一個整數說明了在每行中該字元輸出的個數,而第二個整數指的是需要輸出的行數。編寫一個呼叫該函式的程式。

程式執行結果示例1:

input a char:

k↙

input column and row:

2 3↙

kk

kk

kk

程式執行結果示例2:

input a char:

a↙

input column and row:

3 2↙

aaa

aaa

字元輸入提示資訊:"input a char:\n"

行列數輸入提示資訊:"input column and row:\n"

輸入格式:

"%c"

"%d%d"

輸出格式:"%c"

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>


int main() {
    char ch;
    int m, n;
    printf("input a char:\n");
    scanf("%c", &ch);
    printf("input column and row:\n");
    scanf("%d%d", &m, &n);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            printf("%c", ch);
        }
        printf("\n");
    }
}
用例測試結果執行時間佔用記憶體提示得分
用例1通過2ms256kb2
用例2通過2ms256kb2

提交答案

本次得分/總分:4.00/4.00分


3.魔術師猜數(4分)

題目內容:

在一種室內互動遊戲中,魔術師要每位觀眾心裡想一個三位數abc(a、b、c分別是百位、十位和個位數字),然後魔術師讓觀眾心中記下acb、bac、bca、cab、cba五個數以及這5個數的和值。只要觀眾說出這個和是多少,則魔術師一定能猜出觀眾心裡想的原數abc是多少。例如,觀眾甲說他計算的和值是1999,則魔術師立即說出他想的數是443,而觀眾乙說他計算的和值是1998,則魔術師說:“你算錯了!”。請程式設計模擬這個數字魔術遊戲。要求用函式實現,函式原型為:int Magic(int m);

其中形參m代表觀眾計算的和值。

輸入格式:"%d"

輸出格式:

觀眾計算錯誤,魔術師給出的結論:"The sum you calculated is wrong!\n"

觀眾計算正確,魔術師給出的結論:"The number is %d\n"

輸入樣例1:

1998↙

輸出樣例1:
The_sum_you_calculated_is_wrong!

輸入樣例2:

1999↙

輸出樣例2:
The_number_is_443

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

(注意:在輸出中,“_”代表空格,如果直接將上段示例貼上到程式碼中,應將其替換為空格。)

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>


int main() {
    // 把三個數讀進來,並拆開
    int a, b, c, i;
    int n;
    scanf("%d", &n);
    for (i = 100; i < 1000; i++) {
        int k = i;
        c = k % 10;
        k = k / 10;
        b = k % 10;
        a = k / 10;
        int acb = a * 100 + c * 10 + b;
        int bac = b * 100 + a * 10 + c;
        int bca = b * 100 + c * 10 + a;
        int cab = c * 100 + a * 10 + b;
        int cba = c * 100 + b * 10 + a;
        if (acb + bac + bca + cab + cba == n) {
            printf("The number is %d\n", i);
            break;
        }
    }
    if (i == 1000) {
        printf("The sum you calculated is wrong!\n");
    }



}
用例測試結果執行時間佔用記憶體提示得分
用例1通過2ms256kb2
用例2通過2ms256kb2

提交答案

本次得分/總分:4.00/4.00分


4.計算禮炮聲響次數(4分)

題目內容:

在海軍節開幕式上,有A、B、C三艘軍艦要同時開始鳴放禮炮各21響。已知A艦每隔5秒放1次,B艦每隔6秒放1次,C艦每隔7秒放1次。假設各炮手對時間的掌握非常準確,請程式設計計算觀眾總共可以聽到幾次禮炮聲。

輸入格式:

輸出格式:"n=%d"

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>

#define maxTime 21*7

int main() {
    int a[maxTime] = {0};
    int sum = 0;
    for (int i = 0; i < 21; ++i) {
        a[sum] = 1;
        sum += 5;
    }
    sum = 0;
    for (int i = 0; i < 21; ++i) {
        a[sum] = 1;
        sum += 6;
    }
    sum = 0;
    for (int i = 0; i < 21; ++i) {
        a[sum] = 1;
        sum += 7;
    }
    int total = 0;
    for (int i = 0; i < 21 * 7; ++i) {
        total += a[i];
    }
    printf("n=%d", total);

}
用例測試結果執行時間佔用記憶體提示得分
用例1通過2ms256kb4

提交答案

本次得分/總分:4.00/4.00分


5.水手分椰子(4分)

題目內容:

n(1<n<=5)個水手在島上發現一堆椰子,先由第1個水手把椰子分為等量的n堆,還剩下1個給了猴子,自己藏起1堆。然後,第2個水手把剩下的n-1堆混合後重新分為等量的n堆,還剩下1個給了猴子,自己藏起1堆。以後第3、4個水手依次按此方法處理。最後,第n個水手把剩下的椰子分為等量的n堆後,同樣剩下1個給了猴子。請用迭代法程式設計計算並輸出原來這堆椰子至少有多少個,n的值要求從鍵盤輸入。若輸入的n值超出要求的範圍,程式輸出"Error!"。

提示:分成的等量的堆數應該與水手的數量一致.

程式執行結果示例1:

Input n(1<n<=5):

5↙

y=3121

程式執行結果示例2:

Input n(1<n<=5):

7↙

Error!

輸入提示資訊:"Input n(1<n<=5):\n"

輸入格式: "%d"

輸出格式:"y=%d\n"

輸入錯誤提示資訊:"Error!\n"

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>

/**
 * 判斷椰子數量能否按照規則進行分割
 * @param n 人數
 * @param total 椰子樹
 * @param times 分割次數,有幾個人就分割幾次
 * @return 能分割返回1,不能分割返回0
 */
int divide(int n, int total, int times) {
    // 當第n+1次分割時,已經分割完n次了,椰子數滿足分割條件返回1,即遞迴出口
    if (times > n) {
        return 1;
    }
    // 椰子可以分割的條件是,當前次可以分割,並且以後的分割都可以進行
    // 前次可以分割的條件是,椰子數量total-1後能被分成n份即((total - 1) % n) == 0
    // 以後的分割可不可以進行,可以看做是第一個人藏完椰子後,椰子的數量,能否進行分割,即分成更小的問題規模
    return !((total - 1) % n) && divide(n, (total - 1) / n * (n - 1), ++times);
   
}

int main() {
    int n;
    printf("Input n(1<n<=5):\n");
    scanf("%d", &n);
    if (n <=1 || n > 5) {
        printf("Error!\n");
        return 0;
    }
    // 暴力列舉,哪個能按照要求分割,哪個就合理。找到第一個就行
    int total = n+1;
    while (1) {
        if (divide(n, total, 1)) {
            printf("y=%d\n", total);
            break;
        }
        total++;
    }
}
用例測試結果執行時間佔用記憶體提示得分
用例1通過6ms256kb1
用例2通過1ms256kb2
用例3通過3ms256kb1

提交答案

本次得分/總分:4.00/4.00分


6.遞迴法計算遊戲人員的年齡(4分)

題目內容:

有n個人圍坐在一起,問第n個人多大年紀,他說比第n-1個人大2歲;問第n-1個人,他說比第n-2個人大2歲,.....,問第3個人,他說比第2個人大2歲;問第2個人,他說比第1個人大2歲。第1個人說自己10歲,問第n個人多大年紀。

遞迴函式原型:unsigned int ComputeAge(unsigned int n);

提示:

計算年齡的遞迴公式為:

輸入格式:"%u"

輸出格式:"The person's age is %u\n"

輸入樣例1:

5↙

輸出樣例1:

The_person's_age_is_18

輸入樣例2:

10↙

輸出樣例2:

The_person's_age_is_28

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

(注意:在輸出中,“_”代表空格,如果直接將上段示例貼上到程式碼中,應將其替換為空格。)

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>

unsigned int ComputeAge(unsigned int n) {
    if (n == 1) {
        return 10;
    }
    return ComputeAge(n - 1) + 2;
}

int main() {
    unsigned int n;
    scanf("%u", &n);
    printf("The person's age is %u\n", ComputeAge(n));

}
用例測試結果執行時間佔用記憶體提示得分
用例1通過2ms256kb2
用例2通過2ms256kb2

提交答案

本次得分/總分:4.00/4.00分


7.遞迴法計算兩個數的最大公約數(4分)

題目內容:

利用最大公約數的性質計算。對正整數a和b,當a>b時,若a中含有與b相同的公約數,則a中去掉b後剩餘的部分a-b中也應含有與b相同的公約數,對a-b和b計算公約數就相當於對a和b計算公約數。反覆使用最大公約數的上述性質,直到a和b相等為止,這時,a或b就是它們的最大公約數。這三條性質,也可以表示為:

性質1 如果a>b,則a和b與a-b和b的最大公約數相同,即Gcd(a, b) = Gcd(a-b, b)

性質2 如果b>a,則a和b與a和b-a的最大公約數相同,即Gcd(a, b) = Gcd(a, b-a)

性質3 如果a=b,則a和b的最大公約數與a值和b值相同,即Gcd(a, b) = a = b

程式執行結果示例1:

Input a,b:16,24↙

8

程式執行結果示例2:

Input a,b:-2,-8↙

Input error!

輸入提示資訊:"Input a,b:"

輸入錯誤提示資訊:"Input error!\n"

輸入格式:"%d,%d"

輸出格式:"%d\n"

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>

/**
 * 更相減損
 * @param a
 * @param b
 * @return
 */
int gcd(int a, int b){
    if (a > b) {
        return gcd(a - b, b);
    }
    if (b > a) {
        return gcd(a, b - a);
    }
    return a;
}

int main() {
    int a, b;
    printf("Input a,b:");
    int k = scanf("%d,%d", &a, &b);
    if (k != 2 || a <= 0 || b <= 0) {
        printf("Input error!\n");
        return 0;
    }
    printf("%d\n", gcd(a, b));
    return 0;
}

#include<stdio.h>

/**
 * 轉轉相除法
 * @param a
 * @param b
 * @return
 */
/*int gcd(int a, int b){
    if (!b) {
        return a;
    }
    return gcd(b, a % b);
}

int main() {
    int a, b;
    printf("Input a,b:");
    int k = scanf("%d,%d", &a, &b);
    if (k != 2 || a <= 0 || b <= 0) {
        printf("Input error!\n");
        return 0;
    }
    printf("%d\n", gcd(a, b));
    return 0;
}*/
用例測試結果執行時間佔用記憶體提示得分
用例1通過2ms256kb1
用例2通過2ms256kb1
用例3通過2ms256kb1
用例4通過2ms256kb1

提交答案

本次得分/總分:4.00/4.00分


8.尋找中位數v1.0(4分)

題目內容:

編寫一個函式返回三個整數中的中間數。函式原型為:int mid(int a, int b, int c);

函式功能是返回a,b,c三數中大小位於中間的那個數。

輸入格式:"%d%d%d"

輸出格式:"The result is %d\n"

輸入樣例1:

12 6 18↙

輸出樣例1:
The_result_is_12

輸入樣例2:
-9 7 -2↙

輸出樣例2:

The_result_is_-2

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

(注意:在輸出中,“_”代表空格,如果直接將上段示例貼上到程式碼中,應將其替換為空格。)

時間限制:500ms記憶體限制:32000kb

C

#include<stdio.h>



int main() {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    int m = a > b ? a : b;
    int n = c < m ? c : m;
    printf("The result is %d\n", n);
    return 0;
}
用例測試結果執行時間佔用記憶體提示得分
用例1通過2ms256kb2
用例2通過2ms256kb2

提交答案

本次得分/總分:4.00/4.00分


9.還原算術表示式(4分)

題目內容:

編寫程式求以下算式中XYZ的值,其中兩數XYZ與YZZ相加的和n(99<n<1000)的值要求從鍵盤輸入。

程式執行結果示例1:

Input n(n<1000):

532↙

X=3,Y=2,Z=1

程式執行結果示例2:

Input n(n<1000):

977↙

Invalid

輸入提示:"Input n(n<1000):\n"

輸入格式:"%d"

輸出格式:"X=%d,Y=%d,Z=%d\n"

計算不成功(無解)的輸出提示:"Invalid\n"

注意:為避免出現格式錯誤,請直接拷貝貼上上面給出的輸入、輸出提示資訊和格式控制字串!

時間限制:500ms記憶體限制:32000kb

C

#include "stdio.h"
int main() {
    int n, x, y, z, flag = 0;
    printf("Input n(n<1000):\n");
    scanf("%d", &n);
    if (n > 99 && n < 1000) {
        //flag為1時不需要繼續迴圈了
        for (x = 0; x <= 9 && flag != 1; x++) {
            for (y = 0; y <= 9 && flag != 1; y++) {
                for (z = 0; z <= 9; z++) {
                    //x * 100 + y * 10 + z + y * 100 + z * 10 + z
                    if (n == x * 100 + y * 110 + z * 12) {
                        flag = 1;
                        printf("X=%d,Y=%d,Z=%d\n", x, y, z);
                        break;
                    }
                }
            }
        }
        if (!flag) {
            printf("Invalid\n");
        }

    }

    return 0;
}
用例測試結果執行時間佔用記憶體提示得分
用例1通過1ms256kb1
用例2通過2ms256kb1
用例3通過1ms256kb1
用例4通過1ms256kb1

提交答案

本次得分/總分:4.00/4.00分