试题
一、如果已知英制长度的英尺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;
}
思维:数组不定说一定从行开始排,有时候列开始排更好