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

第1题

#include <stdio.h>
void main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    printf("相信自己,我肯定能通过本次考试!\n");
}

第2题

问题 B: 矩形块的面积

#include <stdio.h>
void main()
{
    int x,y,z,m,sum;
    scanf("%d%d%d%d",&x,&y,&z,&m);
    sum=m-z-y+x;
    printf("%d",sum);
}

第3题

压缩编码的解码

#include <stdio.h>
void main()
{
    int n;
    char ch;
    while(scanf("%d%c",&n,&ch)!=EOF)
{
   for(int i=0;i<n;i++)
   printf("%c",ch);
}
}

第4题

知识抢答赛

#include <stdio.h>
int main()
{
    int n,m;
    scanf("%d",&n);
    m=(n+23)/4;
    if(m<=20&&n>=-20)
    printf("%d",m);
    else
    printf("Score is error!");
    return 0;
}

第5题

字符串模糊匹配

#include <stdio.h>
#include <string.h>
int main()
{
   char a[1000000],b[1000000];
   gets(a);
   gets(b);
   int i=0,j=0;
   for(;i<strlen(a)&&j<strlen(b);i++)
   if(a[i]==b[j])
   j++;
   if(j==strlen(b))
   printf("Congratulations!");
   else
   printf("Sorry!");
   return 0;
}

第6题

湖南省大学生程序设计竞赛团体名次(Ⅱ)

#include <stdio.h>
#include <string.h>
int main()
{
   int a[10]={4,3,4,5,6,5,6,9,2,5};
   int year;
   scanf("%d",&year);
   printf("%d",a[year-2012]);
   return 0;
}

第7题

就业率(函数版)

/****** begin ******/
// 你的函数实现位置。只需提交函数的定义代码,并且提交语言只能选择C(不能选C++)
int cal_employment_rate(int class_size, int employed)
{
    int sum;
    sum=((employed*100+class_size/2)/class_size);
    return sum;
}
/******** end *******/

第8题

指定区间 [a,b] 内的质数个数,大部分同学的解法如下:

#include <stdio.h>
#include <math.h>
int main()
{
    int i,j,a,b,count=0;
    scanf("%d%d",&a,&b);
    for(int i=a;i<=b;i++)
    {
    for(j=2;j<=sqrt(i)+1;j++)
       if(i%j==0)
       break;
       if(i%j!=0||i==2)
       count++;
    }
    printf("%d",count);
    return 0;
}

这个题目一般会报时间超时,一种快速筛查质数的解法,参考:https://www.rookieslab.com/posts/fastest-way-to-check-if-a-number-is-prime-or-not 有下面的 c++ 实现代码:

#include <bits/stdc++.h>

using namespace std;

template<class T1,class T2>
bool cmin(T1& a,const T2& b){return a>b?a=b,1:0;}
template<class T1,class T2>
bool cmax(T1& a,const T2& b){return a<b?a=b,1:0;}
using ll=long long;
bitset<1000001> d;
int main(){
	ll a,b;//[a,b]
	cin>>a>>b;
	for (ll i=a;i<=b;i++)
		d[i-a]=i==1?0:1;
	ll w=sqrt(b);
	for (ll i=2;i<=w;i++){
		for (ll k=a%i==0?a:a/i*i+i;k<=b;k+=i)
			if (k!=i)
				d[k-a]=0;
	}
	//for (ll i=a;i<=b;i++)
	//	cout<<d[i-a]<<" ";
	cout << d.count() << endl;
}

对上述答案或者代码看不懂的可以看我这篇文章 快速判断区间类质数的个数方法探讨 的分析,相信你一定茅塞顿开!

第9题

#include <stdio.h>
int main()
{
    int a[11],m;
    scanf("%d",&m);
    int n=m+1;
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    if(n>2)
    if(a[0]==1)
    printf("x^%d",n-1);
    else 
    if(a[0]==-1)
    printf("-x^%d",n-1);
    else if(a[0]!=0)
    printf("%dx^%d",a[0],n-1);
    for(int i=1;i<n-2;i++)
    {
    if(a[i]==1)
    printf("+x^%d",n-i-1);
    else if(a[i]<0)
    if(a[i]==-1)
    printf("-x^%d",n-i-1);
    else
    printf("%dx^%d",a[i],n-i-1);
    else
    if(a[i]!=0)
    printf("+%dx^%d",a[i],n-i-1);
    }
    if(n>=2)
    if(a[n-2]==1)
    if(n>2)
    printf("+x");
    else
     printf("x");
    else if(a[n-2]<0)
    if(a[n-2]==-1)
    printf("-x");
    else
    printf("%dx",a[n-2]);
    else 
    if(a[n-2]!=0)
    if(n>2)
    printf("+%dx",a[n-2]);
    else
    printf("%dx",a[n-2]);
    if(a[n-1]<0)
    printf("%d",a[n-1]);
    else 
    if(a[n-1]>0)
    if(n!=1)
    printf("+%d",a[n-1]);
    else
    printf("%d",a[n-1]);
    return 0;
}

第10题

/****** begin ******/
// 你的函数实现位置。只需提交函数的定义代码,并且提交语言只能选择C(不能选C++)

struct fraction add(struct fraction a, struct fraction b)
{
	struct fraction c;
	c.numer=a.numer*b.deno+b.numer*a.deno;
	c.deno=a.deno*b.deno;
	int x,y,t=1;
	x=c.numer;
	y=c.deno;
	while(y%x!=0)
	{
		t=y%x;
		y=x;
		x=t;
	}
	if(x!=1)
	c.numer=c.numer/x;
	c.deno=c.deno/x;
	return c;
}
struct fraction multiply(struct fraction *px, struct fraction *py)
{
	struct fraction c;
	c.numer=px->numer*py->numer;
	c.deno=px->deno*py->deno;
		int x,y,t=1;
	x=c.numer;
	y=c.deno;
	while(y%x!=0)
	{
		t=y%x;
		y=x;
		x=t;
	}
	if(x!=1)
	c.numer=c.numer/x;
	c.deno=c.deno/x;
	return c;
	
}
/******** end *******/