第7周编程题在线测试

来源:互联网 发布:ubuntu jdk rpm 安装 编辑:程序博客网 时间:2024/06/10 23:33

递归法计算游戏人员的年龄

题目内容:
有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

#include <stdio.h>unsigned int ComputeAge(unsigned int n);int main(){    unsigned int age;    scanf("%u", &age);    printf("The person's age is %u\n", ComputeAge(age));    return 0;}unsigned int ComputeAge(unsigned int n){    if(n == 1)        return 10;    else    {        return ComputeAge(n - 1)+2;    }}

递归法计算两个数的最大公约数

题目内容:
利用最大公约数的性质计算。对正整数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:”
输入格式:”%d,%d”
输出格式:
输出最大公约数:”%d\n”
输入错误提示信息:”Input error!\n”

#include <stdio.h>int Gcd(int i, int j);int main(){    int a, b;    int c;    printf("Input a,b:");    scanf("%d,%d", &a, &b);    c = Gcd(a, b);    if (c == -1)    {        printf("Input error!\n");    }    else    {        printf("%d\n", c);    }    return 0;}int Gcd(int i, int j){    if (i <= 0 || j <= 0)    {        return -1;    }    else    {        if(i == j)        {            return i;        }        else if (i > j)        {            return Gcd(i - j, j);        }        else        {            return Gcd(i, j - i);        }    }}

寻找中位数v1.0

题目内容:
编写一个函数返回三个整数中的中间数。函数原型为: 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

#include <stdio.h>int mid(int a, int b, int c);int main(){    int i, j, k;    scanf("%d%d%d",&i, &j, &k);    printf("The result is %d\n", mid(i, j, k));    return 0;}int mid(int a, int b, int c){    if((a < b && b < c) || (a > b && b > c))    {        return b;    }    else    {        return mid(b, c, a);    }}

还原算术表达式

题目内容:
编写程序求以下算式中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”

特别注意 x > 5 or y > 5 or z > 5;

#include <stdio.h>void Resolution(int i);int main(){    int n;    printf("Input n(n<1000):\n");    scanf( "%d" , &n);    Resolution(n);    return 0;}void Resolution(int i){    int find = 0;    int x, y, z;    for (x = 1; x <= 9; x++)    {        for (y = 1; y <= 9; y++)        {            for (z = 1; z <= 9; z++)            {                if(z * 2 + (y + z) * 10 + (x + y) * 100 == i)                {                    printf("X=%d,Y=%d,Z=%d\n",x, y, z);                    find = 1;                    break;                }            }        }    }    if(!find)    {        printf("Invalid\n");    }}

谐均值计算

题目内容:
两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个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” (注意:等号的两边各有一个空格)

#include <stdio.h>double Calculate(double x,double y);int main(){    double x, y;    printf("Input two doubles:\n");    scanf("%lf%lf", &x, &y);    printf("1/((1/x+1/y)/2) = %0.3f\n", Calculate(x, y));    return 0;}double Calculate(double x,double y){    return 1.0 / ((1.0 / x + 1.0 / y) / 2);}

输出指定行列数的字符

题目内容:
编写一个函数,函数原型: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”

#include <stdio.h>void Chline(char ch, int column, int row);int main(){    char c;    int col, r;    printf("input a char:\n");    scanf("%c", &c);    printf("input column and row:\n");    scanf("%d%d", &col, &r);    Chline(c, col, r);    return 0;}void Chline(char ch, int column, int row){    int i, j;    for (i = 0; i < row; i++)    {        for (j = 0; j < column; j++)        {            printf("%c", ch);        }        printf("\n");    }}

魔术师猜数

题目内容:
在一种室内互动游戏中,魔术师要每位观众心里想一个三位数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

#include <stdio.h>int Magic(int m);int main(){    int n;    scanf("%d", &n);    if (Magic(n) == -1)    {        printf("The sum you calculated is wrong!\n");    }    else    {        printf("The number is %d\n", Magic(n));    }    return 0;}int Magic(int m){    int a, b, c, sum, find = 0;    for (a = 1; a <= 9; a++)    {        for (b = 1; b <= 9; b++)        {            for (c = 1; c <= 9; c++)            {                sum = a * 100 + c * 10 + b + b * 100 + a * 10 + c + b * 100 + c * 10 + a + c * 100 + a* 10 + b + c * 100 + b * 10 + a;                if (sum == m)                {                    return a * 100 + b * 10 + c;                    find = 1;                }            }        }    }    if (! find)    {        return -1;    }}

计算礼炮声响次数

题目内容:
在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。
输入格式:无
输出格式:”n=%d”

#include <stdio.h>int main(){    int a, b, count = 21 * 3;    for (a = 5; a <= 21 * 5; a = a + 5)    {        if (a % 30 == 0)        {            count--;        }        if (a % 35 == 0)        {            count--;        }    }    for (b = 7; b <= 21 * 7; b = b + 7)    {        if (b % 42 == 0)        {            count--;        }    }    printf("n=%d", count);    return 0;}

迭代法

#include <stdio.h>int MaxCommonFactor(int a, int b);int main(){     int a, b, x;     printf("Input a,b:");     scanf("%d,%d", &a, &b);     x =MaxCommonFactor(a, b);     if (x != -1)     {          printf("MaxCommonFactor = %d\n", x);     }     else     {          printf("Input error!\n");     }     return 0;}//函数功能: 计算两个正整数的最大公约数,-1表示没有最大公约数int MaxCommonFactor(int a, int b){     int r;     if (a<=0 || b<=0) return -1; // 保证输入的参数为正整数     do{          r = a % b;          a = b;          b = r;     }while (r != 0);     return  a;}

水手分椰子

题目内容:
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”

这是一道著名的数学问题,解题通式为
y=a(a/m)n-1 -db/c

y ── 被分的椰子的总个数
a ── 每次分的份数,
n ── 总共分的次数
b ── 每次分a份后的余数.
c ── 每次分a份后拿走的份数
d ── 每次分a份后拿走c份后,剩下再分的份数.
m —— (a/d)的最大公约数

#include <stdio.h>int divide(int n, int m);static int people;int main(){    int i;    int n;    printf("Input n(1<n<=5):\n");    scanf("%d", &n);    people = n;    if (n <= 1 || n > 5)    {        printf("Error!\n");    }    else    {        for (i = 1; ;i++)        {            if (divide(i, n))            {                printf("y=%d\n", i);                break;            }        }    }    return 0;}int divide(int n, int m){    if (n / people == 0 || n % people != 1)        return 0;    if (m == 1)        return 1;    return divide(n - n / people - 1,m - 1);}
0 0
原创粉丝点击