PTA(02)典例详解(7-48 龟兔赛跑7-49 币值转换7-51 念数字7-53 抓老鼠啊~亏了还是赚了?7-56 谁先倒7-58 输出GPLT7-60 福到了)

目录

7-48 龟兔赛跑

7-49 币值转换

7-51 念数字

7-53 抓老鼠啊~亏了还是赚了?

7-56 谁先倒

7-58 输出GPLT

7-60 福到了


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,也就是我们是如何做到替换的呢,就是从右下角左后一个元素开始判断,如果那个在原来是有符号的,那么就输出了我们要替换的符号,如果是 空格那么我们就输出空格,从而做到了替换和倒置

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nuc-不晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值