PAT甲级1019解法

一个人想着一个人 提交于 2020-02-03 12:07:35

原题链接

https://pintia.cn/problem-sets/994805342720868352/problems/994805487143337984

思路

这题提出了一个术语——Palindromic Number,学术翻译叫做回文数,用通俗的话讲就是对称数,正着写和倒着写都一样,比如最近在讨论的20200202。本题将对称数的范围从十进制扩展到了任意进制,即在给定进制下正写和倒写都一样,比如27在二进制下是11011,那么27就是二进制下的对称数。题目给出十进制的数值,同时给出进制数,需要计算十进制数值在给定进制下是否为对称数。

经过之前的题目,这题应该非常简单。我们已经知道了十进制转其他进制的方法,用vector存储转换出来的每一位数,最后从vector的首尾数字分别开始进行比较即可。需要注意的是比较位数从首尾开始的下标范围,以及最后输出时最后一位后面不能带空格。代码如下:

代码

#include <iostream>
#include <vector>
using namespace std;
void print(vector<int> baseNum);
int main()
{
    int decNum, base;
    bool flag = true;   //判断结果
    vector<int> baseNum;    //存储转换进制后的数
    cin >> decNum >> base;
    while (decNum / base != 0)  //转换进制
    {
        baseNum.push_back(decNum%base);
        decNum /= base;
    }
    baseNum.push_back(decNum);
    for (int i = 0; i < baseNum.size()/2; i++)  //比较首尾数字是否相等
    {
        if (baseNum[i] != baseNum[baseNum.size() - 1 - i])  //如果存在不相等的
        {
            flag = false;   //置flag为false
            break;
        }
    }
    if (flag == false)
    {
        cout << "No" << endl;
        print(baseNum);
    }
    else
    {
        cout << "Yes" << endl;
        print(baseNum);
    }
    return 0;
}
void print(vector<int> baseNum)
{
    for (int i = baseNum.size() - 1; i >= 0; i--)
    {
        if (i == 0)
            cout << baseNum[i];
        else
            cout << baseNum[i] << ' ';
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!