2020年哈尔滨工业大学C语言程序设计精髓 第七周练兵编程题

/害,这期算比较简单,但是第五题水手和椰子属实有点难,如果没有解决本来的数学问题去编程的话,是不可能解决的,同学们也要打好数学基础,继续努力啊,下下个周就进入指针了只会越来越难。/
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

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

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

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

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

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

4
计算礼炮声响次数(4分)
题目内容:
在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。
输入格式:无
输出格式:“n=%d”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
#define count 21
int change( int a, int b )
 {
    int i;
    for (i= a; i<=a*b ; i++ )
    {
        if ( i % a == 0 && i % b ==0 )
            break;
    }
    return i;
 }
int main()
{
    int recover;
    int n=0,a,b,c;
    for(a=0,b=0,c=0;c<=count*7;b+=6,c+=7,a+=5)
    {
                if(a!=b&&b!=a&&a!=c)
            {
                n++;
            }
    }
    recover=5*count/change(5,6)+6*count/change(6,7)+5*count/change(5,7);
    printf("n=%d",n*3-recover);
    return 0;
 }

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
/此题参考https://www.cnblogs.com/maskwolf/p/10018955.html/

#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);
}

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

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

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

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

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

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

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

#include <stdio.h>
void Recover(int m)
{
    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 == m)
                {
                    printf("X=%d,Y=%d,Z=%d\n",x, y, z);
                    return 0;
                }
                if(x==9&&z==9)
                {
                    printf("Invalid\n");
                    return 0;
                }
            }
        }
    }

}
int main()
{
    int n;
    printf("Input n(n<1000):\n");
    scanf( "%d", &n);
    Recover(n);
    return 0;
}
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值