目录
7-48 龟兔赛跑
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出
@_@
,兔子赢输出^_^
,平局则输出-_-
;后跟1空格,再输出胜利者跑完的距离。输入样例:
242
输出样例:
@_@ 726
解题思路:难点主要在兔子等龟的时候,前提条件就是时间可以整除10且兔子的路程大于龟
只要在这个条件内设出循环,也就是龟仍然前进而兔子不动即可,代码如下
#include <stdio.h>
int main()
{
int z;//输入的时间T
int t;
int a;
int tu=0,gui=0;//兔子和乌龟的路程
scanf("%d",&z);
for(t=1;t<=z;t++){
gui=gui+3;
tu=tu+9;
//满足兔子休息的条件
if(t%10==0&&tu>gui){
for(a=t+1;a<=t+30&&a<=z;a++){
gui=gui+3;
tu=tu+0;
}
t=a-1;
}
}
//输出
if(tu>gui){
printf("^_^ %d",tu);
}else if(tu<gui){
printf("@_@ %d",gui);
}else{
printf("-_- %d",tu);
}
}
7-49 币值转换
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
这道题要考虑的还是蛮多的,比如个十百千万后就要再变成十 万,百 万,而如果是整千整万则后面不需要出现零,这些情况都要考虑到
解题思路:将输入的数字分解存入数组,以下标判断以上我所提到的情况,使用switch case对应输出,代码如下:
#include <stdio.h>
void f(int k);
void g(int k);
int main()
{
int num;
int i;
scanf("%d",&num);
if(num==0)
printf("a");
int buf[10]={0};
int cnt=0;
do{
buf[cnt++]=num%10;//个位数存入数组
num/=10;//sum值改变
}while(num!=0);
for(int i=cnt-1;i>=0;i--){
if(buf[i]!=0){
f(buf[i]);
g(i);
}
if(buf[i]==0&&(i==8||i==4))
g(i);
if(buf[i]==0&&(i==2||i==6)&&buf[i-2]!=0)
f(0);
if(buf[i]==0&&(i==1||i==5)&&buf[i-1]!=0)
f(0);
}
return 0;
}
void f(int k){
switch (k){
case 0:printf("a");
break;
case 1:printf("b");
break;
case 2:printf("c");
break;
case 3:printf("d");
break;
case 4:printf("e");
break;
case 5:printf("f");
break;
case 6:printf("g");
break;
case 7:printf("h");
break;
case 8:printf("i");
break;
case 9:printf("j");
break;
}
}
void g(int k){
switch (k){
case 1:printf("S");
break;
case 2:printf("B");
break;
case 3:printf("Q");
break;
case 4:printf("W");
break;
case 5:printf("S");
break;
case 6:printf("B");
break;
case 7:printf("Q");
break;
case 8:printf("Y");
break;
case 9:printf("S");
break;
}
}
7-51 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出
fu
字。十个数字对应的拼音如下:0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu
输入格式:
输入在一行中给出一个整数,如:
1234
。提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si
。输入样例:
-600
输出样例:
fu liu ling ling
解题思路:先考虑0和负数的情况,如果是负数则输出fu并将负数转换成正数方便后面switch
需要注意的是行末没有最后的空格(当时写第五题的数数字的时候这个条件差点逼疯我),代码如下
#include <stdio.h>
#define N 12
int main(){
int arr[N] = {0};
int num; scanf("%d", &num);
if (num == 0)
printf("ling\n");
else{
if (num < 0){
printf("fu ");
num = -num;
}
int i = 0;
while (num > 0){
arr[i++] = num % 10;
num /= 10;
}
int j;
for (j=i-1; j>=0; j--){
switch(arr[j]){
case 0: printf("ling");break;
case 1: printf("yi"); break;
case 2: printf("er"); break;
case 3: printf("san"); break;
case 4: printf("si"); break;
case 5: printf("wu"); break;
case 6: printf("liu"); break;
case 7: printf("qi"); break;
case 8: printf("ba"); break;
case 9: printf("jiu"); break;
}
if (j > 0)
printf(" ");
}
}
return 0;
}
7-53 抓老鼠啊~亏了还是赚了?
本题讲解参考http://t.csdn.cn/UUtB5,讲的很详细很清晰
7-56 谁先倒
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数
N
(≤100),随后N
行,每行给出一轮划拳的记录,格式为:甲喊 甲划 乙喊 乙划
其中
喊
是喊出的数字,划
是划出的数字,均为不超过100的正整数(两只手一起划)。输出格式:
在第一行中输出先倒下的那个人:
A
代表甲,B
代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。输入样例:
1 1 6 8 10 9 12 5 10 5 10 3 8 5 12 12 18 1 13 4 16 12 15 15 1 1 16
输出样例:
A 1
解题思路:只需根据算法判断是甲喝还是乙喝,谁喝谁的酒量就-1,直到减到小于0,则说明已倒下,输出结果,代码如下:
#include<stdio.h>
int main(){
int j,y;
scanf("%d %d",&j,&y);
int n;
scanf("%d",&n);
int jhan,jhua,yhan,yhua;
int i=0;
int jhe=0,yhe=0;
for(i=0;i<n;i++){
scanf("%d %d %d %d",&jhan,&jhua,&yhan,&yhua);
if(jhua==(jhan+yhan)&&yhua!=(jhan+yhan)){
jhe++;
j--;
if(j<0){
printf("A\n");
printf("%d\n",yhe);
break;
}
}else if(yhua==(jhan+yhan)&&jhua!=(jhan+yhan)){
yhe++;
y--;
if(y<0){
printf("B\n");
printf("%d\n",jhe);
break;
}
}
}
return 0;
7-58 输出GPLT
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按
GPLTGPLT....
这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT
的顺序打印,直到所有字符都被输出。输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
这道题看起来复杂条件多但是其实根本不用管,使用#include<string.h>头文件之后只要统计GPLT出现的次数即可,在第二个循环中GPLT出现一次就直接输出一次,即可达到题目中所要求的按顺序与忽略其他字母,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c;
int num1=0,num2=0,num3=0,num4=0;
while(scanf("%c",&c)&&c!='\n')
{
if(c=='G'||c=='g')
num1++;
else if(c=='P'||c=='p')
num2++;
else if(c=='L'||c=='l')
num3++;
else if(c=='T'||c=='t')
num4++;
}
while(num1||num2||num3||num4)
{
if(num1>0)
{
printf("G");
num1--;
}
if(num2>0)
{
printf("P");
num2--;
}
if(num3>0)
{
printf("L");
num3--;
}
if(num4>0)
{
printf("T");
num4--;
}
}
return 0;
}
7-60 福到了
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符
@
或者为空格。而倒过来的汉字所用的字符由裁判指定。输入格式:
输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为
@
或者为空格。输出格式:
输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出
bu yong dao le
,然后再用输入指定的字符将其输出。输入样例 1:
$ 9 @ @@@@@ @@@ @@@ @ @ @ @@@ @@@ @@@ @@@@@ @@@ @ @ @ @@@ @@@@@ @ @ @ @ @ @@@@@
输出样例 1:
$$$$$ $ $ $ $ $ $$$$$ $$$ $ $ $ $$$ $$$$$ $$$ $$$ $$$ $ $ $ $$$ $$$ $$$$$ $
输入样例 2:
& 3 @@@ @ @@@
输出样例 2:
bu yong dao le &&& & &&&
这道题我先给出代码再解释
#include<stdio.h>
#include<string.h>
int main()
{
char c,d;
int n,i,j,flag=1;
scanf("%c%d",&c,&n);
getchar();//处理回车
char a[100][100];
for(i=0;i<n;i++)
gets(a[i]);//有空格用gets
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(a[i][j]!=a[n-1-i][n-1-j])
{flag=0;break;}
}
if(flag)
printf("bu yong dao le\n");
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=0;j--)
if(a[i][j]==' ')
printf(" ");
else printf("%c",c);
printf("\n");
}
return 0;
}
前面大家应该都能看懂,包括是否对称等等,其后大家可能不知道是怎么输出怎么倒置怎么转换的
大家注意, 我在读入这个图形时是++,也就是从左上往右下走,而在后面是减减,那么是从右下往左上走,注意我们输入的那个要替换的字符是c,也就是我们是如何做到替换的呢,就是从右下角左后一个元素开始判断,如果那个在原来是有符号的,那么就输出了我们要替换的符号,如果是 空格那么我们就输出空格,从而做到了替换和倒置