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通过1ms256kb 2
用例2通过1ms256kb 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通过2ms256kb 2
用例2通过2ms256kb 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通过2ms256kb 2
用例2通过2ms256kb 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通过2ms256kb 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通过6ms256kb 1
用例2通过1ms256kb 2
用例3通过3ms256kb 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通过2ms256kb 2
用例2通过2ms256kb 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通过2ms256kb 1
用例2通过2ms256kb 1
用例3通过2ms256kb 1
用例4通过2ms256kb 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通过2ms256kb 2
用例2通过2ms256kb 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通过1ms256kb 1
用例2通过2ms256kb 1
用例3通过1ms256kb 1
用例4通过1ms256kb 1

提交答案

本次得分/总分:4.00/4.00分

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eva_5433

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值