C语言机试篇(三)

题目一:对齐输出

描述

读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们。
格式
输入格式
只有一行,按照格式要求依次输入三个整数,之间以一个空格分开。
输出格式
只有一行,三个整数,即输入的第二个整数。
样例
输入样例

123456789 0 -1

输出样例

123456789 0 -1

#include <stdio.h>

int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    printf("%8d %8d %8d",a,b,c);
    return 0;
}

题目二:周末舞会

描述

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
格式
输入格式
第一行两队的人数; 第二行舞曲的数目。
输出格式
配对情况。
样例
输入样例

4 6
7

输出样例

1 1
2 2
3 3
4 4
1 5
2 6
3 1

#include <stdio.h>

int main(){
    int maleNum,femaleNum,songNum;
    scanf("%d %d",&maleNum,&femaleNum);
    scanf("%d",&songNum);
    int p=0,q=0;//指向当前要跳舞的跳舞者
    for(int i=0;i<songNum;i++){
        printf("%d %d\n",p%maleNum+1,q%femaleNum+1);
        p++;
        q++;
    }
    return 0;
}

题目三:围圈报数

描述

有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,打印出列的顺序。
格式
输入格式
n和m。
输出格式
出列的顺序。
样例
输入样例

4 17

输出样例

1 3 4 2

#include<stdio.h>
 
int main()
{
    int n, m;
	scanf("%d %d",&n, &m);
    int temp[n];
    for(int i=0; i<n; i++)
        temp[i] = 1;
    int outNum = 0;//出列人数
    int num = 0;//报数的人数
    int index = 0;//当前下标
    while(outNum<n)
    {
        if(index==n)
            index = 0;
        if(temp[index]==1){
			num++;//报数
		}else{//如果不报数即该位置人已出列,index指向下一个元素并进行下一次循环
			index++;
			continue;
		}
        if(num==m)//数到m的人出列
        {
            outNum++;
            temp[index] = 0;
			printf("%d ", index+1);
            num = 0;
        }
        index++;//不论是否出列index指向下一个元素
    }
    return 0;
}

题目四:大象喝水

描述

一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数)。问大象至少要喝多少桶水才会解渴。
格式
输入格式
输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深h和底面半径r,单位都是厘米。
输出格式
输出一行,包含一个整数,表示大象至少要喝水的桶数。
样例
输入样例

23 11

输出样例

3

#include <stdio.h>

int main(){
    int h,r;
    scanf("%d %d",&h,&r);
    float v=3.14159*r*r*h/1000;
    int ans=20/v+1;
    printf("%d",ans);
	return 0;
}

题目五:汉诺塔问题

描述

约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。

这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615

这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。

假定圆盘从小到大编号为1, 2, …
格式
输入格式
输入为一个整数(小于20)后面跟三个单字符字符串 。整数为盘子的数目,后三个字符表示三个杆子的编号。
输出格式
输出每一步移动盘子的记录。一次移动一行。每次移动的记录为例如 a->3->b 的形式,即把编号为3的盘子从a杆移至b杆。
样例
输入样例

2 a b c

输出样例

a->1->c
a->2->b
c->1->b

#include <stdio.h>
#include <stdlib.h>

void hannuo(int n,char a,char b,char c){
	if(n==1){
		printf("%c->%d->%c\n",a,n,b);
	}else{
		hannuo(n-1,a,c,b);//把a柱上的n-1个挪到c上
		printf("%c->%d->%c\n",a,n,b);//把a柱上的最后一个挪到b上
		hannuo(n-1,c,b,a);//把c柱上的n-1个挪到b上
	}

}

int main(){
	int n;
	char a,b,c;
	scanf("%d %c %c %c",&n,&a,&b,&c);
	hannuo(n,a,b,c);
	return 0;
}

tip:通过递归调用解决

题目六:猴子称王

#include<stdio.h>
 
int main()
{
    int n, m;
	scanf("%d %d",&n, &m);
    int temp[n];
    for(int i=0; i<n; i++)
        temp[i] = 1;
    int outNum = 0;//退出的猴子数
    int num = 0;//报数的猴子数
    int index = 0;//当前下标
    while(outNum<n)
    {
        if(index==n)
            index = 0;
        if(temp[index]==1)
            num++;//报数
        if(num==m)//数到m的猴子退出圈外
        {
            outNum++;
			if(outNum==n){
				printf("%d\n", index+1);
			}
            temp[index] = 0;
            num = 0;
        }
        index++;
    }
    return 0;
}

题目七:字母转换

将SS所指字符串中所有下标为奇数位置的字母转换为大写(若该位置上不是字母则不转换)
样例:
输入:
abc4Efg
输出:
aBc4EFg

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

int main()
{
	char temp[1000];
	scanf("%s",temp);
	int len=strlen(temp);
	for(int i=1;i<len;i+=2){
		if(temp[i]>='a'&&temp[i]<='z'){
			temp[i]=temp[i]-'a'+'A';//A的ASCII码为65,a的ASCII码为97,相差32
		}
	}
	printf("%s",temp);
    return 0;
}

题目八:字符三角形

描述

给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形。
格式
输入格式
只有一行,就是一个字符。
输出格式
三行,每行都是由输入的字符组成,字符个数分别是1、3、5。

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

int main()
{
	char n;
	scanf("%c",&n);
	printf("  %c  \n",n);
	printf(" %c%c%c \n",n,n,n);
	printf("%c%c%c%c%c\n",n,n,n,n,n);
    return 0;
}

题目九:字符串比较

描述

将两个字符串进行比较。
格式
输入格式
输入两行,第一行字符串a。 第二行为字符串b。
输出格式
输出一行,如果字符串a等于字符串b,输出Y,否则输出N。
样例
输入样例

abc
abc

输出样例

Y

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

int main()
{
	char tempA[1000],tempB[1000];
	scanf("%s",&tempA);
	scanf("%s",&tempB);
	int lenA=strlen(tempA);
	int lenB=strlen(tempB);
	if(lenA!=lenB){
		printf("N\n");
		return 0;
	}
	for(int i=0;i<lenA;i++){
		if(tempA[i]!=tempB[i]){
			printf("N\n");
    		return 0;
		}
	}
	printf("Y\n");
    return 0;
}

题目十:求一元二次方程

描述

求一元二次方程“ax^2+bx+c=0”的根,其中a不等于0。结果要求精确到小数点后5位。

若两个实根相等,则输出形式为:“x1=x2=XXX.XXXXX”;

若两个实根不等,需满足根小者在前的原则,中间用分号隔开,输出形式为:“x1=XX.XXXXX;x2=XX.XXXXX";

若无实根输出“No answer!”。
格式
输入格式
输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程a的系数。
输出格式
输出一行,表示方程的解。 所有输出部分要求精确到小数点后5位,数字、符号之间没有空格。
样例
输入样例

-15.97 19.69 12.02

输出样例

x1=-0.44781;x2=1.68075

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
	double a,b,c;
	scanf("%lf %lf %lf",&a,&b,&c);
	double x1,x2;
	if((b*b-4*a*c)==0){
		printf("x1=x2=%0.5lf",-b/(2*a));
	}
	else if((b*b-4*a*c)<0){
		printf("No answer!");
	}
	else{
		x1=(-b-sqrt(b*b-4*a*c))/(a*2);
		x2=(-b+sqrt(b*b-4*a*c))/(a*2);
		if(x1<x2){
			printf("x1=%0.5lf;x2=%0.5lf",x1,x2);
		}else{
			printf("x1=%0.5lf;x2=%0.5lf",x2,x1);
		}

	}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值