【全网最细PAT题解】【PAT乙】1044 火星数字(测试点2,测试点4详细解释)

2023-11-15

题目链接

1044 火星数字

题目描述

火星人是以 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

题目大意

给你一个新定义的进制,让你完成阿拉伯数字和新进制的互相转换

解题思路

本题是个非常麻烦的题,要注意的点非常多,在注释中我也有比较详细的标注,下面我来说一说需要注意的几个点

	int n;
    cin>>n;
    //这个getchar非常重要!!
    //因为下面是用getline来读取字符串,
    // 没有这个getchar吞掉输入整形n以后的回车(也就是\n),
    // 下面的字符串s会认为输入的第一个字符串是换行符
    getchar();
  • 当判断输入的第i个字符串时,可以通过s[0]是不是数字来判断是阿拉伯数字还是火星文
    • 如果是数字,可以通过C++11中的stoi来将字符串转化为整形方便运算,具体可以看【经验】关于c++11中string类型字符串和整形相互转化的用法,同时,测试点2测试点4也是阿拉伯数字转化为火星文的问题,具体看下面对测试点2测试点4的解释即可
    • 如果是字母,说明是火星文.因为火星文不管个位还是十位,最多单个位数只有4个字符,当字符串的总长度比4大时,说明火星文既有个位又有十位,否则只有个位或者十位(这里可能只有十位没有个位,具体看下面解释)
  • 需要注意火星文中能被整除的情况是不需要输出个位0的,这里可以参考下面关于测试点4解释中举的例子
    测试点2是当输入地球的0时应该输出一个tret
    测试点4是当输入能被13整除的非零地球文字时,火星文应该只输出十位,不输出个位(比如输入13,输出的应该是tam而不是tam tret

题解

#include<bits/stdc++.h>
using namespace std;
string a[13]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
string b[13]={"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
int main(){
    int n;
    cin>>n;

    //这个getchar非常重要!!
    //因为下面是用getline来读取字符串,
    // 没有这个getchar吞掉输入整形n以后的回车(也就是\n),
    // 下面的字符串s会认为输入的第一个字符串是换行符
    getchar();

    for(int i=0;i<n;i++){
        string s;

        //主要这个地方只能用getline不能用cin
        //因为输出的火星文可能为两位,中间有个空格,用cin无法正确保存(比如elo nov)
        getline(cin,s);
        if(isdigit(s[0])){      //如果第一位是数字的话,代表是地球的进制

            //通过C++11的新增函数将字符串转化为整形
            //在PAT考试中C++11也是被允许使用的
            int num = stoi(s);

            //这里需要提前判断地球数字够不够外星人的十位,因为
            // 够了的话个位前面要有个空格,
            // 不够的话个位前面没有空格
            //还需要判断这个地球文字能不能被13整除,
            // 如果整除输出只有十位
            //比如13应该输出tam而不是tam tret
            if(num%13==0) {
                if(num!=0)  cout<<b[num/13]<<endl;
                else  cout<<"tret"<<endl;
            }
            else{
                if(num>13)  cout<<b[num/13]<<" ";
                cout<<a[num%13]<<endl;
            }
        }
        else{       //此时第一位不是数字说明是火星文

            if(s.length()>4){
                //因为火星文的个位最多就四个字母,
                // 当长度大于4时说明给出的火星文是有十位的,
                // 小于4则代表只有个位

                int j=0;
                while(s[j]!=' ')    j++;        //找到空格的位置

                //分别截取火星文的个位和十位
                string tempb=s.substr(0,j);       //代表十位
                string tempa=s.substr(j+1);             //代表个位

                int sum=0;
                //判断火星文个位等于地球的多少
                for(int k=0;k<15;k++){
                    if(a[k]==tempa){
                        sum+=k;
                    }
                }

                //判断火星文的十位等于地球的多少
                for(int k=0;k<15;k++){
                    if(b[k]==tempb){
                        sum+=k*13;
                    }
                }
                cout<<sum<<endl;

            }
            else{
                //火星文长度小于等于4,说明只有一位

                //这里注意一个很严重的问题,火星文如果是个位为0的话是不输出的
                // 比如(13在火星文中的输出为tam而不是tam tret)
                //所以只有一位可能是只有十位,而不是只有一位就是个位

                for(int j=0;j<15;j++){
                    //因为长度小于4只有一位位,所以找到了就相当于当前火星文翻译完成
                    if(s==a[j]){
                        cout<<j<<endl;
                        break;
                    }
                    else if(s==b[j]){
                        cout<<j*13<<endl;
                        break;
                    }
                }

            }

        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【全网最细PAT题解】【PAT乙】1044 火星数字(测试点2,测试点4详细解释) 的相关文章

  • 在应用程序版本中使用 svn 修订号

    在 VS2010 解决方案 不是 NET 中 我希望将 svn 修订号作为应用程序版本的一部分包含在内 我们目前不使用 makefile 仅使用 VS 解决方案 项目设置 我想在编译时获取工作副本修订号 将其存储到变量中 以便稍后在代码中使
  • 如何向 SDL 线程发送附加参数?

    是的 我知道如何创建 SDL 线程 int myfunc void data my code SDL CreateThread mythread SDL CreateThread myfunc NULL 但如果我想做类似的事情怎么办 int
  • 如何在编译时检查该类是否是抽象的?

    我所说的抽象类是指至少具有一个纯虚方法的类 如果检查显示该类是 我希望编译失败not抽象的 有可能吗 Use std is abstract http en cppreference com w cpp types is abstract
  • 在 C++ 中将惰性生成器实现为forward_iterator

    MyGenerator 表示 可能 有限的整数序列 计算成本很高 所以我不想预先生成它们并将它们放入容器中 struct MyGenerator bool HasNext int Next 要打印全部 MyGenerator generat
  • 寻找发音的正确性

    我需要借助 Microsoft 语音 SDK 来识别用户发音的 质量 System Speech Recognition 我使用的是 MS Speech Engine US 所以我实际需要的是找出说话者的声音与 北美 口音的接近程度 实现此
  • 删除行时 QModelIndex 变得无效

    我正在子类化QAbstractItemModel显示项目QTreeView 并且在这个子类中 projectModel 我有一个功能可以删除树视图中当前选定的索引 Component是用于表示模型所有成员的类 void projectMod
  • 使用 C# 的服务 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄

    有人知道如何使用 C 获取远程服务上的 SACL 吗 我尝试了很多不同的方法 但基本上没有什么效果 我可以在本地计算机上获取 DACL 和 SACL 但在远程计算机上获取其中任何一个似乎都不可能 我所做的是创建一个名为ServiceSecu
  • 如何在 Windows 中获取和设置系统音量

    我想使用 unity 和 c 将键盘点击时的操作系统音量设置为一定水平 例如我想将 Windows 音量 不是 unity 设置为 70 我该怎么做 void Update if Input GetKeyDown KeyCode A Set
  • 如何将类成员函数的返回类型设置为私有结构的对象

    很抱歉这个又长又令人困惑的标题 但我想不出更好的方法来问这个问题 所以 我有一堂课 template
  • 使用实体框架如何在没有一个庞大查询结果集或数百个小型查询的情况下创建嵌套对象?

    我使用 EF 填充对象 然后在业务层代码中与之交互 这些对象有多个级别 但我们首先将其简化为典型的主从示例Order and OrderLine 假设我需要检索 50 个订单 每个订单大约有 100 个订单行 并且我需要所有这些数据 在 E
  • 表达式树序列化器

    我想在客户端使用 Linq 表达式 序列化它们并在服务器端执行它们 为此我想使用 http expresstree codeplex com http expressiontree codeplex com 但我想针对自己的 WCF 调用执
  • bet365 网站上 Selenium 的 Chrome 驱动程序陷入灰屏

    当我尝试使用 Chrome 驱动程序和 Selenium 打开 bet365 网站时出现灰屏 var driver new ChromeDriver driver Navigate GoToUrl https www bet365 it 我
  • Unity构建错误

    所以我制作了我的游戏并尝试构建它 我收到一些对我来说毫无意义的错误 这是错误 UnityEditor BuildPlayerWindow BuildMethodException 2 个错误 在 UnityEditor BuildPlaye
  • 无需使用abs函数或if语句即可获取绝对值

    我在想如何在不使用的情况下获得整数的绝对值if声明也不abs 起初我使用的是左移位 lt lt 试图将负号移出范围 然后将位右移回原来的位置 但不幸的是它对我不起作用 请让我知道为什么它不起作用以及其他替代方法 From 位摆弄黑客 htt
  • 如何以编程方式停止/退出/终止 dotnet core HostBuilder 控制台应用程序?

    我正在尝试创建一个 dotnet 核心控制台应用程序 该应用程序是一个简单的实用程序应用程序 应该启动 执行其操作并退出 使用 Visual Studio 生成的标准控制台应用程序模板可以轻松实现 但现在我们有了 HostBuilder 它
  • C# Windows 应用程序中的文件上传

    在我的 C Windows 应用程序中 我想上传 pdf 文件 但在我的工具箱中找不到 FileUpload 控件 我如何在 C Windows 应用程序中上传 pdf 文件 regards 将 OpenFileDialog 控件放在窗体上
  • gfortran 未定义的引用

    我正在尝试编译一个依赖很多东西的程序 我使用并修改了提供的 makefile 来代表我的计算机设置 但在编译的最后一步中我不断收到许多未定义的引用 导致问题的命令行是 gfortran o cosmomc ParamNames o Matr
  • 如何在不实际调整大小的情况下触发 Control.Resize 事件?

    我不会对控件进行子类化 尝试通过触发事件Control Size Control Size失败 因为即使新大小实际上不同 它也不会触发 如果您要子类化Control 你可以打电话OnResize直接 或者将其暴露在 API 上 public
  • 收到不明确符号的错误,需要帮助来删除它

    我收到此错误 无法在 Visual Studio 2010 中删除 我正在使用一个第三方库 该库使用自己的 字符串 定义 另外 Visual Studio 的 xstring 文件位于其安装的文件夹中 现在 当我尝试编译代码时 出现以下错误
  • 列出所有会话信息

    我想在页面中显示我的asp net页面 aspx 的所有会话信息 我怎样才能做到这一点 编程语言是C 这两种方法对我有用 稍微改进和纠正了大卫的答案 第一种方法 for int i 0 i lt Session Count i var cr

随机推荐