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通過 | 1ms | 256kb | 2 | |
用例2通過 | 1ms | 256kb | 2 |
本次得分/總分: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通過 | 2ms | 256kb | 2 | |
用例2通過 | 2ms | 256kb | 2 |
本次得分/總分: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通過 | 2ms | 256kb | 2 | |
用例2通過 | 2ms | 256kb | 2 |
本次得分/總分: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通過 | 2ms | 256kb | 4 |
本次得分/總分: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通過 | 6ms | 256kb | 1 | |
用例2通過 | 1ms | 256kb | 2 | |
用例3通過 | 3ms | 256kb | 1 |
本次得分/總分: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通過 | 2ms | 256kb | 2 | |
用例2通過 | 2ms | 256kb | 2 |
本次得分/總分: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通過 | 2ms | 256kb | 1 | |
用例2通過 | 2ms | 256kb | 1 | |
用例3通過 | 2ms | 256kb | 1 | |
用例4通過 | 2ms | 256kb | 1 |
本次得分/總分: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通過 | 2ms | 256kb | 2 | |
用例2通過 | 2ms | 256kb | 2 |
本次得分/總分: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通過 | 1ms | 256kb | 1 | |
用例2通過 | 2ms | 256kb | 1 | |
用例3通過 | 1ms | 256kb | 1 | |
用例4通過 | 1ms | 256kb | 1 |
本次得分/總分:4.00/4.00分