2021年秋C语言重修班期中考试上机参考答案

考试入口:http://acm.hnust.edu.cn/contest.php?cid=2494

Solutions with C:

第1题

如下圆环,给定r和R,求圆环的面积。 img

include <stdio.h>
include <stdlib.h>

int main()
{
    double a,b;
    scanf("%lf %lf",&a,&b);
    double area=3.14*(b*b-a*a);
    printf("The area is %.2lf\n",area);
    return 0;
}

第2题

湖南科技大学ACM集训队在2014年-2016年取得的团体成绩如下: img

请提供查询功能,当输入一个年份时,输出该年份我校的团体总分成绩。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int year;
    scanf("%d",&year);
    if(year==2014)
        printf("4\n");
    else if(year==2015)
        printf("5\n");
    else if(year==2016)
        printf("6\n");
    else
        printf("Unknown\n");
    return 0;
}

第3题

输出n行“三不一要”的具体内容,即输出n行“不轻信、不透露、不转帐,要及时报案”。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int year;
    scanf("%d",&year);
    for(int i=1;i<=year;i++)
    {
        printf("不轻信、不透露、不转帐,要及时报案\n");
    }

    return 0;
}

第4题

严防电信网络诈骗之九大分类

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    if(n>=1&&n<=9&&m>=1&&m<=9)
    {
    	for(int i=m;i<=n;i++)
    	{
    		if(i==1)
    			printf("一、电信网络诈骗之仿冒身份类\n");
    		else if(i==2)
    			printf("二、电信网络诈骗之购物类\n");
    		else if(i==3)
    			printf("三、电信网络诈骗之活动类\n");
    		else if(i==4)
    			printf("四、电信网络诈骗之利益诱惑类\n");
    		else if(i==5)
    			printf("五、电信网络诈骗之虚构意外类\n");
    		else if(i==6)
    			printf("六、电信网络诈骗之日常生活消费类\n");
    		else if(i==7)
    			printf("七、电信网络诈骗之钓鱼木马病毒类\n");
    		else if(i==8)
    			printf("八、电信网络诈骗之提供特定服务类\n");
    		else if(i==9)
    			printf("九、电信网络诈骗之其他新型违法类\n");
    	}
    }
    else
    	printf("Error\n");
}

第5题

给出n个大小不同的整数,求它们中第二大的数。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
    {
    	scanf("%d",&a[i]);
    }
    for(int i=1;i<n;i++)
    {
    	for(int j=0;j<i;j++)
    	{
    		if(a[j]>a[i])
    		{
    			int item=a[i];
    			a[i]=a[j];
    			a[j]=item;
    		}
    	}
    }
    printf("%d",a[n-2]);
}

第6题

现在假设2022年湖南省赛的实际参赛队伍有n支,请你预测一下2022年一、二、三等奖的数量分别是多少?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d",&n);
    double a=n*0.1;
    int first,second,third;
    if((a-(int)a)>0.5)
    	first=(int)a+1;
    else
    	first=(int)a;
    double b=n*0.3-first;
    if((b-(int)b)>0.5)
    	second=(int)b+1;
    else
    	second=(int)b;
    double c=n*0.55-first-second;
    if((c-(int)c)>0.5)
    	third=(int)c+1;
    else
    	third=(int)c;
    printf("First Prize:%d\nSecond Prize:%d\nThird Prize:%d\n",first,second,third);
    return 0;
}

第7题

本题要求实现一个计算两个数的最小公倍数的简单函数。

/* 温馨提示:在此只能粘贴你的函数代码! */
/* Attention:Only FUNCTION code can be pasted here!*/
int LCM( int x, int y )
{
	int a=x,b=y;
	if(a<b)
    {
        int t=a;
        a=b;b=t;
    }
    int GCD,LCM;
    int yushu;
    while(a%b>0)
    {
        yushu=a%b;
        a=b;b=yushu;
    }
    GCD=b;
    LCM=(x*y)/GCD;
    return LCM;
}

第8题

分数相同的人数

#include <stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	int a[n],b[100]={0};
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		b[a[i]]++;
	}
	int max=0;
	for(int i=0;i<100;i++)
	{
		if(max<b[i])
		{
			max=b[i];
		}
	}
	for(int i=0;i<100;i++)
	{
		if(max==b[i])
		{
			printf("%d %d\n",i,b[i]);
		}
	}
}

第9题

多重完全数

/****** begin ******/
// 你的函数实现位置。只需提交函数的定义代码,并且提交语言只能选择C(不能选C++)
void find_multiply_perfect_number(int a, int b)
{
	for(int n=a;n<=b;n++)
	{
		int xigema=0;
		for(int i=1;i<=sqrt(n);i++)
		{
			if(n%i==0)
			{
				if(n/i==i)
				{
					xigema+=i;
					//xigema+=(n/i);
				}
				else
				{
					xigema+=i;
					xigema+=(n/i);
				}
			}
		}
		if(xigema%n==0)
		{
			printf("%d\n",n);
		}
	}
}
/******** end *******/

第10题

一元二次多项式

#include <stdio.h>
#include <math.h>
int  main(void)
{
      int a, b,c;

      scanf("%d%d%d", &a,&b,&c);
      if(fabs(a)==1)
      {
      	if(a==-1)
      		printf("-x^2");
      	else if(a==1)
      	{
      		printf("x^2");
      	}
      }
      else
      {
      	printf("%dx^2",a);
      }
      if(b==0)
      {
      }
      else if(fabs(b)==1)
      {
      	if(b==-1)
      		printf("-x");
      	else if(b==1)
      	{
      		printf("+x");
      	}
      }
      else
      {
      	if(b<-1)
      	{
      		printf("%dx",b);
      	}
      	else
      	{
      		printf("+%dx",b);
      	}
      }
      if(c==0)
      {
      }
      else if(fabs(c)==1)
      {
      	if(c==-1)
      		printf("-1");
      	else if(c==1)
      	{
      		printf("+1");
      	}
      }
      else
      {
      	if(c<-1)
      	{
      		printf("%d",c);
      	}
      	else
      	{
      		printf("+%d",c);
      	}
      }
      return 0;
}

Solutions with C++:

第1题

如下圆环,给定r和R,求圆环的面积。 img

#include<bits/stdc++.h>
using namespace std;

int main(){
	double r, R;
	cin >> r >> R;
	cout << fixed << setprecision(2) <<"The area is " << 3.14 * (R * R - r * r) << endl;
	return 0;
}

第2题

湖南科技大学ACM集训队在2014年-2016年取得的团体成绩如下: img

请提供查询功能,当输入一个年份时,输出该年份我校的团体总分成绩。

#include<bits/stdc++.h>
using namespace std;

int main(){
	int year;
	string rank;
	cin >> year;
	switch(year){
		case 2014:
			rank = "4";
			break;
		case 2015:
			rank = "5";
			break;
		case 2016:
			rank = "6";
			break;
		default:
			rank = "Unknown";
			break;
	}
	cout << rank << endl;
	return 0;
}

第3题

输出n行“三不一要”的具体内容,即输出n行“不轻信、不透露、不转帐,要及时报案”。

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin >> n; 
	for(int i = 0; i < n; i++){
		cout << "不轻信、不透露、不转帐,要及时报案" << endl;
	}
	return 0;
}

第4题

严防电信网络诈骗之九大分类

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n, m;
	string str[9] = {"一、电信网络诈骗之仿冒身份类",
					 "二、电信网络诈骗之购物类",
					 "三、电信网络诈骗之活动类",
					 "四、电信网络诈骗之利益诱惑类",
					 "五、电信网络诈骗之虚构意外类",
					 "六、电信网络诈骗之日常生活消费类",
					 "七、电信网络诈骗之钓鱼木马病毒类",
					 "八、电信网络诈骗之提供特定服务类",
					 "九、电信网络诈骗之其他新型违法类"};
	cin >> n >> m; 
	if(n <= 0 || n > 9 || m <= 0 || m > 9 ||n > m){
		cout << "Error" << endl;
	}else{
		for(int i = n - 1; i < m; i++){
			cout << str[i] << endl;
		}	
	}
	return 0;
}

第5题

给出n个大小不同的整数,求它们中第二大的数。

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	vector<int> v;
	cin >> n;
	for(int i = 0; i < n; i++){
		int num;
		cin >> num;
		v.push_back(num);
	}
	*max_element(v.begin(), v.end()) = INT_MIN;
	cout << *max_element(v.begin(), v.end());
	return 0;
}

第6题

现在假设2022年湖南省赛的实际参赛队伍有n支,请你预测一下2022年一、二、三等奖的数量分别是多少?

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin >> n;
	int ans1, ans2, ans3;
	ans1 = round(n * 0.1);
	ans2 = round(n * 0.3 - ans1);
	ans3 = round(n * 0.55 - ans1 - ans2);
	cout << "First Prize:" << ans1 << endl;
	cout << "Second Prize:" << ans2 << endl;
	cout << "Third Prize:" << ans3 << endl;
}

第7题

本题要求实现一个计算两个数的最小公倍数的简单函数。

#include<bits/stdc++.h>
using namespace std;

int LCM( int x, int y );

int main()
{
    int x, y;

    scanf("%d %d", &x, &y);
    printf("%d\n", LCM(x, y));

    return 0;
}

/* 你的代码将被嵌在这里 */
int LCM( int x, int y ){
	int a = x, b = y; 
	while(b != 0){
		int temp = a % b;
		a = b;
		b = temp;
	}
	return x * y / a;
}

第8题

分数相同的人数

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int count[101] = {0};
    int n, maxScore, index;
    cin >> n;
    for(int i = 0; i < n; i++){
    	int num;
    	cin >> num;
    	count[num]++;
    }
    maxScore = *max_element(count, count + 101);
    cout << max_element(count, count + 101) - count << " " << maxScore << endl;
    count[max_element(count, count + 101) - count] = 0;
    while(*max_element(count, count + 101) == maxScore){
    	cout << max_element(count, count + 101) - count << " " << maxScore << endl;
    	count[max_element(count, count + 101) - count] = 0;
    }
    return 0;
}

第9题

多重完全数

/****** begin ******/
// 你的函数实现位置。只需提交函数的定义代码,并且提交语言只能选择C(不能选C++)
void find_multiply_perfect_number(int a, int b){
    for(int i = a; i <= b; i++){
        int sum = 0;
        for(int j = 1; j * j <= i; j++){
            if(i % j == 0)
                sum += j + (i / j);
        }
        if(sum % i == 0)
            printf("%d\n", i);
    }
}
/******** end *******/

第10题

一元二次多项式

#include<bits/stdc++.h>
using namespace std;
 
int  main(){
      int a, b, c;
      cin >> a >> b >> c;
  	  if(a == -1){
        cout << "-";
      }else if(a != 1){
        cout << a;
      }
      cout << "x^2";
      if(b != 0){
      	if(b > 0){
	        cout << "+";
	      }else if(b == -1){
	        cout << "-";
	      }
	      if(b != -1 && b != 1){
	        cout << b;
	      }
	      cout << "x";
      }
      if(c != 0){
      	if(c > 0){
      		cout << "+";
      	}
      	cout<< c;
      }
      return 0;
}