c语言机试题考研复试分数线,考研复试-----C语言上机操作(一)

序:

本人今年参加研究生考试,为了练习所找到的历年真题,和方便重新学习,写此博客,具体的学校我就不提了,感兴趣的童鞋们可以联系我。好了,正式开始吧!

本系列操作试题总共分为四道题,每道题分为问题描述、问题思路和参考代码。希望大家能提出改进意见!

第一题:

1,问题描述

给你一个数n,使用递归求n!

2,问题思路

此题算是开胃小菜,解决的方式方法题目也都给出,需要整明白的就是①会求阶乘。如:3!= 3*2*1。依次类推,既得n!= n*(n-1)*(n-2)....*2*1。②了结递归。程序调用自身的编程技巧称为递归(recursion),一般来说,递归需要有边界条件(必须有,否则将会导致无限循环)、递归前进段和递归返回段。

3,参考代码

/*****************************

File name:recursion

Author:zhangsanVersion:1.0Date:2018/3/18

Description:对一个数字n递归求n!

*****************************/

#include "stdio.h"

/*****************************

*函数名: recursion_fun

*作用:求n!

*参数:n - 所求阶乘的值

*返回值:n!的结果

*****************************/

int recursion_fun(int n){

if(n == 0) return 0;

if(n == 1) return 1;    //递归结束条件

elsereturn n * recursion_fun( n-1 );     //自己调用自己

}

//主函数

int main(){

int n,res;

printf("请输入递归数字:");

scanf("%d",&n);

res = recursion_fun(n);//n!

printf("\n %d! = %d",n,res);

return 0;

}

第二题:

1,问题描述

给你一个年份,还有一个数字n,以1月1日为第一天,然后你根据n的值来求出是几月几号。

2,问题思路

解决此题的关键是两点,①判断年份是瑞年还是平年。方法:年份能被4整除且不能被100整除,则为瑞年。年份能被400整除则为瑞年。②根据n怎么求那月那日。具体的思想可以在代码中查看。

3,参考代码

/*****************************

File name:year-month-day

Author:zhangsanVersion:1.0Date:2018/3/18

Description:给出年份和今年的第几天n,算出今天是几月几日

*****************************/

#include "stdio.h"

/*****************************

*函数名: date_fun

*作用:求出一年中的第n天是几月几号并输出

*参数:n-一年的第几天year- 哪一年

*返回值:无

*****************************/

date_fun(int year,int n){

int i,month=0,day=0,count;

count = n;

//arr1数组是平年月份的天数,arr2是瑞年月份的天数

int arr1[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

int arr2[12] = {31,29,31,30,31,30,31,31,30,31,30,31};

if((year % 4 == 0&& year % 100 != 0)||year % 400 == 0){//判断年的种类

for(i = 0;i < 12;i++){//根据不同的年份调用不同的数组

if(n > arr2[i]){

n -= arr2[i];

}else{

break;

}

}

printf("\n%d年中的第%d天是%d月%d日。\n",year,count,i+1,n);

}else{

for(i = 0;i < 12;i++){

if(n > arr1[i]){

n -= arr1[i];

}else{

break;

}

}

printf("\n%d年中的第%d天是%d月%d日。\n",year,count,i+1,n);

}

}

//主函数

int main(){

int year,n;

printf("请输入年份:year = ");

scanf("%d",&year);

printf("\n");

printf("请输入天数:n = ");

scanf("%d",&n);

date_fun(year,n);//得出结果

return 0;

}

第三题:

1,问题描述

给你一串数字,实现其排序,然后把排序后重复的数字只留下一个。如(3,5,5,2,1,4,6)--->(1,2,3,4,5,6)。

2,问题思路

这个问题的解题思路还是非常清晰的,有两步,一是排序,二是去重。排序你就可以选择你熟悉的一种,包括选择排序、插入排序、希尔排序、快速排序、冒泡排序等,在此文中我们采取冒泡排序。而针对于去重,我们采取申请新的内存地址,对排序好的数组进行对比,例用a[5]和其他前边的五个数进行相比,如果没有相同的,就证明此数是唯一的,便存入新的数组,以达到删选的目的。

3,参考代码

/*****************************

File name:remove_repeat

Author:zhangsanVersion:1.0Date:2018/3/19

Description:给一串数字,实现其排序,然后把排序后重复的数字只留下一个

*****************************/

#include "stdio.h"

/*****************************

*函数名: swap

*作用:交换两个数的值

*参数:*i - 第一个数的地址 *j - 第二个数的地址

*返回值:无

*****************************/

swap(int *i, int *j){

int temp;

temp = *i;

*i = *j;

*j = temp;

}

/*****************************

*函数名: bubble_sort

*作用:冒泡排序

*参数:*a - 传进来的排序数组

*返回值:无

*****************************/

bubble_sort(int *a){

int i,j;

for( i = 0; i <10 - 1 ; i++){

for( j = 1; j < 10 - 1 -i; j++){

if(a[j] < a[j-1])

swap(&a[j],&a[j-1]);

}

}

}

/*****************************

*函数名: remove_repeat

*作用:移除数组中的重复元素

*参数:*a - 传进来的排序数组

*返回值:无

*****************************/

remove_repeat(int *a){

int b[10],i,index = 1;

b[0] = a[0];

for( i = 1;i < 10 ;i++){

if(a[i] != a[i-1]){

b[index++] = a[i];

}

}

for( i = 0;i < index; i++){

printf("%d ",b[i]);

}

}

//主函数

int main(){

int a[10],i;

printf("请输入10个数字(中间使用空格隔开):\n");

for( i = 0; i < 10; i++){

scanf("%d",&a[i]);

}

bubble_sort(a);//对原数组进行排序

remove_repeat(a);//得出结果

return 0;

}

第四题:

1,问题描述

给你一个数n,然后使其成为一个n层的金字塔,其中金字塔上面一个数字比它下面两个数字小。你的任务就是从最上面开始往下走,只能向下走相邻的两个数字,从第一层走到最下面一层,求出其最大值(金字塔的数据结构你要自己建,老师过来给你数据,你再在控制台上输)。 金子塔样子:

3

4  5

4  6  6

7  12  13  8

2,问题思路

3,参考代码

#include "stdio.h"

#include "string.h"

#include "math.h"

#include "windows.h"

//第i层里边找,i-1最大下标的值为num

selectfun(int *a,int n,int i,int num){

Sleep(2000);

printf("\n----%d----\n",i);

printf("\n++++%d++++\n",num);

int res=0;

int temp;

i--;

int summary=0;

while(i!=0){

summary += i;

i--;

}

i++;

if(i==n){

printf("===%d====",a[summary+num]);

}else{

printf("%d",i);

printf("aa");

if(a[summary+num]>a[summary+num+1]){

res =summary+num;

}else{

res =summary+num+1;

}

temp = i+1;

printf("%d",temp);

selectfun(a,n,temp,res);

}

}

int main(){

int i=0,j=0;

int n=0,sum=0,count=0;

//主体

scanf("%d",&n);

while(n!=0){

count += n;

n--;

}

int a[count];

for(i=0;i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值