PAT B1044的几个答案

本文介绍了一个简单的程序设计问题,即实现地球数字与火星文数字之间的转换。通过建立字符串与数字之间的映射关系,文章详细展示了如何使用C语言进行编程解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目是这样的:

火星人是以13进制计数的:

  • 地球人的0被火星人称为tret。
  • 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
  • 火星人将进位以后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。

例如地球人的数字“29”翻译成火星文就是“hel mar”;而火星文“elo nov”对应地球数字“115”。为了方便交流,请你编写程序实现地球和火星数字之间的互译。

输入格式:

输入第一行给出一个正整数N(<100),随后N行,每行给出一个[0, 169)区间内的数字 —— 或者是地球文,或者是火星文。

输出格式:

对应输入的每一行,在一行中输出翻译后的另一种语言的数字。

输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
题目比较简单,建立字符串和数字的对应关系一一查找替换即可,稍微有点麻烦的是字符串知识薄弱,不知道一整个字符串的一部分如何拿来和别的字符串进行比较。这个题目比较简单,字符串内肯定不会分隔成超过两个字符串,于是在中间空格部位加了
'\0',把前面当做一个字符串,后面的存在另一个新建的字符串里,再利用strcmp函数进行比较。代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=200;
char str[maxn][maxn];
int main(){
    char G[13][maxn]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
    char S[13][maxn]={"OK","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
    int N;
    scanf("%d",&N);
    getchar();
    for(int i=0;i<N;i++){
        gets(str[i]);
    }
    for(int i=0;i<N;i++){
        int len=strlen(str[i]);
        if(str[i][0]>='0'&&str[i][0]<='9'){
            int ans1=0,carry=1,first,second;
            for(int j=len-1;j>=0;j--){
                ans1+=carry*(str[i][j]-'0');
                carry*=10;
            }
            first=ans1/13;
            second=ans1%13;
            if(ans1<=12){
                printf("%s\n",G[second]);
            }else{
                if(second==0){
                    printf("%s\n",S[first]);
                }else printf("%s %s\n",S[first],G[second]);
            }


        }else{
            if(len<=4){
                for(int j=0;j<13;j++){
                    if(strcmp(G[j],str[i])==0){
                        printf("%d\n",j);
                        break;
                    }
                    if(strcmp(S[j],str[i])==0){
                        printf("%d\n",j*13);
                    }
                }
            }else{
                int ans2=0;
                char temp[10];
                for(int j=4;j<len;j++){
                    temp[j-4]=str[i][j];
                }
                temp[3]='\0';
                str[i][3]='\0';
                for(int j=0;j<13;j++){
                    if(strcmp(S[j],str[i])==0){
                        ans2+=j*13;
                        break;
                    }
                }
                for(int j=0;j<13;j++){
                    if(strcmp(G[j],temp)==0){
                        ans2+=j;
                        break;
                    }
                }
                printf("%d\n",ans2);
            }
        }
    }
    return 0;
}
还有一点需要注意的:利用循环输入字符串的之前输入了循环次数N,然后敲了回车键,这样第一个gets()就保存了这个换行符,所以少一个循环。正确的做法是在循环之前写一行getchar(),保存那个换行符。
百度了另外两个代码,分别用字符数组和string来写的。
利用字符数组来写的代码地址:http://blog.youkuaiyun.com/chr1991/article/details/50726405。
和我的代码差不多,不同之处在于:
第一、isdigit(字符)判断是否为数字,如果是,返回1,否则返回0,使用的时候要加上头文件#include<ctype.h>。
第二、对于字符串内部某一段和另外一个字符串是否一样,使用了strstr函数。strstr函数的简单用法是:strstr(str1,str2),返回字符串str2在字符串str1中第一次出现的位置指针,如果找不到,返回NULL。
利用string来写的代码地址:
http://blog.youkuaiyun.com/wanmeiwushang/article/details/51502126
使用string的输入方法:getline(cin,str变量名),可以输入一整行,若利用getline输入字符数组一整行,方法为cin.getline(str变量名,数字),数字至少比str变量长度大1。之后对于可能的用空格分开的两个string,新建一个string,初始化为空格,然后加上每个需要的字符就可以了,再之后string的比较就很简单了。
不知道关于字符串内部比较还有没有新的方法,目前就先学习到这吧。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值