C语言复试上机(入门篇-入门模拟)

  1. 害死人不偿命的(3n+1)猜想
    问题描述:对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1.
    要求:给定一个不超过1000的正整数n,需要多少步才能得到n=1?
    输入样例:3
    输出样例:5
#include <stdio.h>

int main(){
	int n,count=0 ;	
	scanf("%d",&n);
	while(n!=1){
		if(n%2==0){
			n/=2;
			count++;
		}
		else{
			n = (3*n+1)/2;
			count++;
		}
	}
	printf("%d",count);
	return 0;
} 

问题描述:在第1行给出不超过10的5次方的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其说代表学校的编号(从1开始连续编号)及比赛成绩(百分之),用空格分隔.
要求:在一行中给出总得分最高的学校的编号及其总分,中间以空格分隔。题目保证答案唯一
输入样例:在这里插入图片描述

输出样例:2 150

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

int main(){
	int n,schid,score;
	scanf("%d",&n);  // 参赛人数
	int a[n];
	memset(a,0,sizeof(a));
	for(int i=n;i>0;i--){ // 循环输入 
		scanf("%d %d",&schid,&score);
		a[schid] += score;	
	}
	
	int max = 0;
	for(int i=0;i<n;i++){ // 求出最大的总分 
		if(a[i]>=max)
			max = a[i];
	}
	for(int i=0;i<n;i++){ // 定位最大总分对应的学校编号 
		if(a[i]==max)
			printf("%d %d\n",i,max);
	}
} 

  1. 查找元素
    问题描述:输入一个数n(1<=n<=200),然后输入n个数值各不相同的数,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)
    要求:
    输入样例:
    4
    1 2 3 4
    3
    输出样例:2
#include <stdio.h> 

int main(){
	int n;
	scanf("%d",&n); // 输入数组大小 
 	int a[n];
 	for(int i=0;i<n;i++){
	 	scanf("%d",&a[i]);
	 }
	int x;
	scanf("%d",&x); //输入要查找的元素
	int i;
	for(i=0;i<n;i++){
		if(a[i]==x){
			printf("%d",i);
			break;
		}		
	} 
	if(i==n)printf("%d",-1);
	return 0;
}

  1. 图形输出
    问题描述:在一行中给出正方形边长N(3<=N<=20)和组成正方形边的某种字符C,间隔一个空格。
    要求:由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结构哦看上去更像正方形,所输出的行数实际上是列数的50%
    输入样例:10 a
    输出样例:
aaaaaaaaaa

a        a

a        a

a        a

aaaaaaaaaa
#include <stdio.h>

int main(){
	int row,col;
	char c;
	scanf("%d %c",&col,&c);
	if(col%2==1) row = col/2 + 1;
	else row = col / 2;
	//第一行
	for(int i=0;i<col;i++){
		printf("%c",c);
	} 
	printf("\n");
	// 第2~row-1行 
	for(int i=2;i<row;i++){
		
		printf("%c",c);
		for(int j=0;j<col-2;j++){
			printf(" ");
		}
		printf("%c\n",c);
	}
	//第row行
	for(int i=0;i<col;i++){
		printf("%c",c);
	} 
	return 0;
} 

  1. 日期处理
    问题描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天,有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
    要求:每组数据输出一行,即日期差值
    输入样例:20130101
    20130105
    输出样例:5
#include <stdio.h>

bool isLoop(int y){ // 判断是否为闰年 
	return (y%4==0&&y%100!=0)||(y%400==0);
}

int main(){

	int first,second,temp;
	scanf("%d",&first);
	scanf("%d",&second);
	if(first>second){
		// 使第一个日期早于第二个日期 
		temp = second;
		second = first;
		first = temp;
	} 
	
	// 区别闰年与平年日期 
	int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
	{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
	
	// 获取年月日 
	int y1,m1,d1,y2,m2,d2;
	y1 = first/10000;  
	y2 = second/10000;
	m1 = first%10000/100;
	m2 = second%10000/100;
	d1 = first%100;
	d2 = second%100;
 	
 	int ans = 1;//记录日期差
	while(y1<y2||m1<m2||d1<d2){
		d1 += 1;
		if(d1>month[m1][isLoop(y1)]){   
			m1 += 1;  //月份加一 
			d1 = 1;	  //天数置为一 
		}
		if(m1>12){
			y1 += 1;  // 年份加一 
			m1 = 1;	  // 月份置为一 
		}
		
		ans += 1;
	}  
	printf("%d\n",ans);
	
	return 0;
} 

  1. 进制转换
    问题描述:输入两个非负十进制数A和B(<=2的30次方-1)以及D(进制数),输出A+B的D进制数
    要求:在一行中依次给出三个整数A、B和D(进制数)
    输入样例:123 456 8
    输出样例:1103
#include <stdio.h>
#include <string.h>

int main(){
	int a,b,d;
	scanf("%d %d %d",&a,&b,&d);  // 输入两个非负整数和D进制数
	int sum = a + b;
	// 将sum转换为D进制数
 	int result[10];
 	memset(result,0,sizeof(result));
 	int i = 0;
 	do{
	 	result[i++] = sum % d;
		 sum = sum / d;	
	 }while(sum!=0);
	 // 从高位到低位输出 
	 for(int k=9;k>=0;k--)
	 	printf("%d",result[k]);
	return 0;
} 


  1. 字符串处理
    问题描述:读入一串字符,判断是否是“回文串”。“回文串”是一个正读和反读都一样的字符串,比如“level”或者"noon"就是回文串
    要求:一行字符串,长度不超过255.如果是“回文串”,输出“Yes”,否则输出“No”
    输入样例:12321
    输出样例:Yes
#include <stdio.h>
#include <string.h>

int main(){
	char str[255];
	scanf("%s",&str);
	int num = strlen(str);		
	int count = 0;		
	for(int i=0;i<num/2;i++){
		if(str[i]==str[num-1-i])
			count++;
	}

	if(count==(num/2))
		printf("%s","Yes");
	else
		printf("%s","No");
	
	
	return 0;
}

  1. 说反话
    问题描述:给定一句英语,要求编写程序,将句中所有单词按颠倒顺序输出。
    要求:测试输入包含一个测试用例,在一行内给出长度不超过80的字符串。字符串由若干个单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。每个测试用例的输出占一行,输出倒序后的句子
    输入样例:Hello World Here I Come
    输出样例:Come I Here World Hello
#include <stdio.h>

int main(){
	int num = 0;
	char ans[80][80];
	// 注意小黑窗的时候要Ctrl+Z,在Enter键 
	while(scanf("%s",ans[num])!=EOF){ 
		num ++;
	}
	
	// 倒着输出单词即可 
	for(int i=num-1;i>=0;i--){
		printf("%s",ans[i]);
		if(i>0) printf("%c",' ');
	}
	
	return 0;
} 
#include <stdio.h>
#include <string.h>

int main(){
	char str[90];
	gets(str);
	int len = strlen(str);
	char ans[90][90];
	int row=0,col=0;
	for(int i=0;i<len;i++){
		if(str[i]!=' ') //如果不是空格,则存放至ans[row][col],并令col++ 
			ans[row][col++] = str[i];
		else{		//如果是空格,则说明一个单词结束。行row增加1,列col恢复至0 
			ans[row][col]='\0'; // 末尾是结束符\0 (不加好像也没事)
			row ++;
			col = 0;
		}	
	}
	for(int i=row;i>=0;i--){ //倒着输出单词即可 
		printf("%s",ans[i]);
		if(i>0)printf("%c",' ');
	}	
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值