天梯赛试题

试题

一、如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:
输入在一行中给出1个正整数,单位是厘米。

输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:
170
输出样例:
5 6
代码
``
#include<stdio.h>
int main(){
int foot,inch;
float meter,cm;
scanf("%f",&cm);
meter=cm/100;
foot=meter/0.3048;
inch=(meter/0.3048-foot)*12;
printf("%d %d",foot,inch);
return 0;
}
解题思路:
错误:按二元二次的思维,而foot和inch是两个值,而不是两个变量
正确:meter/0.3048的整数部分作为英尺,小数部分作为英寸,从inch/12=foot可以看出,解二元一次方程的一种方法(特殊情况,因为foot=12inch),而不用枚举
注:数据类型

二.根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。

​2/π=1+1/3+2/(35)+3/(357)+…+n!/(357…*(2n+1))+…
输入格式:
输入在一行中给出小于1的阈值。

输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例:
0.01

输出样例:
3.132157
代码

#include <stdio.h>
int main(){
	float valuef=1,sum=1,thv;
	int i;
	scanf("%f",&thv);
	for(i=1;valuef>=thv;i++){
		valuef=valuef*i/(2*i+1);
		sum+=valuef;
	};
	printf("%.6f",sum*2);
	return 0;
}

解释:用数学的思维来解很难解决,要利用计算机的计算能力

三、输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:
输入在一行中给出一个不超过9位的非负整数。

输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:
813227345

输出样例1:
iYbQdBcScWhQdBeSf

输入样例2:
6900

输出样例2:
gQjB

代码

#include<stdio.h>
int main(){
	int num,post,i,j;     
	int bo=1;        
	//代换法 
	char replay1[10]={'a','b','c','d','e','f','g','h','i','j'};
	char replay2[9]={'S','B','Q','W','S','B','Q','Y'};
	//存输出的值 
	char value[20];
	scanf("%d",&num);
	if(num==0){
		printf("a");
	} 
	else{
		for(i=0,j=0;num>0;i++){
			post=num%10;
			num/=10;
			if(post==0&&bo==1);//除掉尾数的零 
			else{
                if(bo==1){           
                	bo=0;
				} 
				value[j]=replay2[i-1];
				j++; 
				value[j]=replay1[post];
				j++;
			}
		}
		j--;  //最后一个没有存值 
	    for(;j>=0;j--){
	    	while(value[j]=='a'){   //处理中间的零 
	    		j--;
	    		if(value[j]=='W')  //10300030 防止万被省略
	    		printf("W");
	    		j--;
	    		bo=1; 
			} 
			if(bo==1){
	           printf("a");
	           bo=0;
	        }
	       
		   printf("%c",value[j]);
	}
	}
	
	return 0;
}

数字金额转换为中文形式:
1、每一个数字带一个单位
2、0特殊
①、零不带单位
②、尾数的零省略
③、中间的零连续两个及其以上的写为一个
④、 10300030中万会变省略,故要加
解法:
先写出全部,把尾数的零省略
再处理中间的零
最后逆序输出

四、
double long long
scanf %lf %lld
printf %lf %lld

六、
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John

代码

#include<stdio.h>
typedef struct student{          //存储学生信息 
	int size;
	char name[9];
}Student; 

int main(){
	int num,i;                      //n学生总数 
	int zo;                         //判断男女 
	Student man[25],woman[25];      
	char ch;
	int q=0,p=-1,n=0,m=-1;           //q为男生最高名,p为男生最低名,n和m类似 
	scanf("%d",&num);

	for(i=1;i<=num;i++){         //存信息 
		scanf("%d",&zo);
		if(zo==0){                //女生信息 
		    p++;                                       //好习惯,记下来 
			woman[p].size=i;
		    scanf("%s",woman[p].name);
		}
		else if(zo==1){                   //男生信息 
		    m++;
			man[m].size=i;
		    scanf("%s",man[m].name);
		}
		else{
			printf("输入错误\n");
		}
	}
	for(i=1;i<=num/2;i++){                      //输出 
		if(man[q].size<woman[n].size){          //男生名称大于女生 
			printf("%s %s\n",man[q].name,woman[m].name);
			q++;
			m--;
		}
		else{                                   //女生名称大于男生 
			printf("%s %s\n",woman[n].name,man[p].name);
			n++;
			p--;
		}
	}
	return 0;
}

写了半天的原因:
1、不知道scanf(“%s”,&a);
而用 while((ch=getchar())!=’\n’){
woman[p].name[j]=ch;
j++;
}
2、最后的输出函数写成输入函数
好习惯:
1.循环语句中先自增,再写其他语句,这样就不用循环之后再自减
if(zo==0){ //女生信息
p++; //好习惯,记下来
woman[p].size=i;
scanf("%s",woman[p].name);
}
2、if else if。。。中可以写一些出错的语言
七、
保留有效位

float simpl(float num){  //运算结果保留一位小数
    if(num>0)
        num=(float)floor((num+0.05)*10)/10;
    else if(num<0){
        num=fabs(num);
        num=-(float)floor((num+0.05)*10)/10;
    }
    return num;
}

五、
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印





所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *

输出样例:





2
图形题思路:输出的全部区域都是因素,比如这个题的空格,利用公式就ok
还有就是考虑极端情况,比如n=1

#include<stdio.h>
int main(){
	int n;
	int an=0,sn=0;
	char ch;
	int count,i,j,k;
	
	scanf("%d %c",&n,&ch);
	if(n==1){
		printf("%c\n",ch);
		printf("0");
	}
	else{
	for(count=1;sn*2<=n;count++){
		an=2*count-1;
		sn+=an;
	}
	
	count-=2;//count++和超过范围的,2*count为总行数
	sn-=an; //所用总数 
    an=count*2-1;//第一行个数 
    //上端 
	for(i=count;i>0;i--){
        for(j=(an-2*i+1)/2;j>0;j--){
			printf(" ");
		}
		for(k=2*i-1;k>0;k--){
			printf("%c",ch);
		}
		printf("\n");	
	}
	
	//下端
	for(i=2;i<=count;i++){
		for(j=(an-2*i+1)/2;j>0;j--){
			printf(" ");
		}
		for(k=2*i-1;k>0;k--){
			printf("%c",ch);
		}
		printf("\n");	
	} 
    printf("%d",n-sn*2+1);
}
     
	return 0;	
} 

六、
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10
​4
​​ ,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:
在一行中打印出A−B的结果字符串。

输入样例:
I love GPLT! It’s a fun game!
aeiou

输出样例:
I lv GPLT! It’s fn gm!

#include<stdio.h>
int main(){
	char s[10001],str[10001];
	char ch[256]; //ascll码有256个
	int i;
	gets(s);
	gets(str);
	for(i=0;str[i]!='\0';i++){
		ch[str[i]]=1;
	}
	for(i=0;s[i]!='\0';i++){
		if(!ch[s[i]]){
			printf("%c",s[i]);
		}
	}
	return 0 ; 
}

时间复杂度O(n)

七、
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:
4
This is a test case

输出样例:
asa T
st ih
e tsi
ce s

#include<stdio.h>
#include<math.h>
#include<string.h>
//从行开始排,可能会出现数组越界,j+=N;而从列开始排就不会 
int main(){
	char str[1001];
	char array[101][101];
	int N,len;
	int count;
	int i,j,k;
	scanf("%d\n",&N);

	gets(str);
	
	len=strlen(str);
	count=ceil((float)len/N);//int/int=int

	for(j=count-1;j>=0;j--){
	for(i=0;i<N;i++){
	
			if(str[k]!='\0'){
				array[i][j]=str[k];
				k++; 
			}
			else{
				array[i][j]=' ';
			}
		}
	}
	
	for(i=0;i<N;i++){
		for(j=0;j<count;j++){
			printf("%c",array[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

思维:数组不定说一定从行开始排,有时候列开始排更好

发布了9 篇原创文章 · 获赞 1 · 访问量 266

猜你喜欢

转载自blog.csdn.net/qq_42757083/article/details/104024751