某不知名学校(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;
}
难题我唯唯诺诺,简单题我重拳出击