期末复习测试大题浅析(吐槽)

某不知名学校(dgut)期末模拟测试:

临近期末 可爱的老师给我们布置了期末能力测试(不是期末题 是模拟)

其实写这篇文章 更多的是水一水 吐吐槽 因为这题目质量。。。一言难尽

 

从这四道编程大题 你也就看得出我们学校水平的几斤几两了

当然,你也许想说这不是贬低自己学校吗?nonono,这叫自知之明 学而知不足

为什么不写选择题?因为要放假了 这个理由简单吧

来,大伙看题(不过感觉大部分人都做出来了

第一题

采用递归方法求下面多项式: 其中n和x为任意正整数。在主函数中输入数据并调用函数得到结果。

 

 

分析:首先是复习一下递归,递归是干啥子?函数里面调用函数,你知道,我也知道,但就是不会用对不对 递归注意两点,一个是终止条件,一个是递推关系,

这题终止条件明显是 n=0,和n=1;的时候,递推关系就是n>1的那一行

上代码

老师答案:

#include "stdio.h"
int p(int n,int x){
 if (n==0){
 return 1;
 } else if (n==1) {
 return x;
 } else {
 return (2*n-1)*p((n-1),x)-(n-1)*p((n-2),x)/n;
 }
}
int main()
{ int n, x;
 scanf("%d %d",&n,&x);
 printf("%ld",p(n,x));
 return 0;
}

个人答案

#include<stdio.h>

int dfs(int n,int x){

if(n==0)return 1;//两个终止条件
if(n==1)return x;//多if 写法不太正规,不推荐用
if(n>1)return (2*n-1)*dfs(n-1,x)-(n-1)*dfs(n-2,x)/n;//此处便是递归
return 0;
}
int main()
{
 int n,x;
 scanf("%d%d",&n,&x);
 int res=dfs(n,x);
 printf("%d",res);
 return 0;
}

第二题

求100~200之间的素数

输出示例: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

分析:这道题连输出都给你了,那肯定是打表走天下了

#include<stdio.h>

int main()
{
 printf("101 103 107 109 113 127 131 137 139 149 \n");
 printf("151 157 163 167 173 179 181 191 193 197 \n");
 printf("199");
 return 0;
}

满分不解释

当然 正经做法就是循环遍历一下,看有没有除自己和1以外的因子

老师答案

# include "stdio.h"
# include "math.h"
int main() {
int n,k,i,m=0;
for(n=101; n <=200; n=n+2) {
k=sqrt(n);
for (i=2; i <=k; i++)
if (n%i==0) break;
if (i>=k+1) {
printf("%d ",n);
m=m+1;
}
if(m%10==0) printf("\n");
}
printf ("\n");
return 0;
}

个人答案

#include<stdio.h>

int prime(int n){

 for(int i=2;i<n;i++){
 	
 if(n%i==0)return 0;
 
 }
  return 1;
}

 int main(){

 int cnt=0;

 for(int i=100;i<=200;i++){

 if(prime(i)){

 cnt++;

 printf("%d ",i);
 
 if(cnt==10){

 printf("\n");

 cnt-=10;
 }

 }
}
 
 
 return 0;
}

你还可以用试除法减少一定的时间复杂度

for (int i = 2; i <= x / i; i ++ )

第三题

输入一个长度为5的int型数组,将数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8 输入示例: 1 2 3 4 5 输出示例: 5 4 3 2 1 

分析:逆序这种东西 方法很多,最简单就是你遍历的时候逆序,那不就是逆序输出了吗,又或者直接用双指针一个个对称翻折,又或者用中间变量交换一下等等

老师答案

#include "stdio.h"
#define N 5
int main()
{
int a[N],i,temp;
for (i=0; i <N; i++)
scanf("%d",&a[i]);
for (i=0; i <N/2; i++) {
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
for (i=0; i <N; i++)
printf("%d ",a[i]);
return 0;
}

个人答案(够不够简单

#include<stdio.h>

int main()
{
 int a[5];

 for(int i=0;i<5;i++){
 scanf("%d",&a[i]);
 }
 for(int i=4;i>=0;i--){
 printf("%d ",a[i]);
 }
 return 0;
}

当然,你也可以用双指针算法来降低时间复杂度

#include<stdio.h>

int main()
{
 int a[5];

 for(int i=0;i<5;i++){
 scanf("%d",&a[i]);
 }
 int l=0,r=4,temp;
 while(l<r){
 	temp=a[r];
 	a[r]=a[l];
 	a[l]=temp;
 	l++;
 	r--;
 }
  for(int i=0;i<5;i++){
    printf("%d",a[i]);
 }
 
 return 0;
}

第四题

在主函数中定义如下10个等长的字符串,用另一函数对它们排序,然后在主函数输出这10个已排好序的字符串 abc edf ghi jkl mno pwr stu vwx yz1 234 输入示例: 无 输出示例: 234 abc edf ghi jkl mno pqr stu vwx yz1 

分析:思路很简单,就是一个strcmp比较函数比大小然后排序就好,排序方法很多,选一个自己喜欢的就好;其实,因为给的数据太小太局限。。。这个。。也可以打表出奇迹

没有比这个更简单了吧


#include<stdio.h>

int main()
{
 printf("234 abc edf ghi jkl mno pqr stu vwx yz1");
 return 0;
}

开个玩笑,下面是正经写法

老师答案

#include "stdio.h"
#include "string.h"
int main() {
void sort(char (*p)[6]);
int i;
char str[10][6]={"abc","edf","ghi","jkl","mno","pqr","stu","vwx","yz1","234"};
char (*p)[6];
p=str;
sort(p);
for (i=0; i <10; i++)
printf("%s ",str[i]);
return 0;
}
void sort(char (*s)[6]) {
int i,j;
char temp[6],*t=temp;
for (i=0; i <9; i++)
for (j=0; j <9-i; j++)
if (strcmp(s[j],s[j+1])>0) {
strcpy(t,s[j]);
strcpy(s[j],s[+j+1]);
strcpy(s[j+1],t);
}
}

个人答案:

#include <stdio.h>
#include <string.h>

void print(char** arr, int size)//这里传入char*arr[]也行
{

	for(int i = 0; i < size; i++)
	{
		printf("%s ", arr[i]);
	}
}
	
void Sort(char* arr[], int size)//这里传入char**arr也行 
{
//冒泡排序大法 
	for(int i = 0; i < size - 1; i++)
	{
		for(int j = 0; j < size - i - 1; j++)
		{
			if(strcmp(arr[j], arr[j + 1]) > 0)//利用函数比较大小 ,返回的是int类型 
			{
				char* tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main () 
{
	char* arr[] = {"abc","edf","ghi","jkl","mno","pqr","stu","vwx","yz1","234"};	
	Sort(arr, 10);
	print(arr, 10);
	return 0;
}

难题我唯唯诺诺,简单题我重拳出击

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr丶锤子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值