PAT 甲级 1019 General Palindromic Number (进制转换,vector运用,一开始2个测试点没过)...

本文介绍了一个算法问题,即如何判断一个十进制数在特定进制下是否为回文数。通过进制转换和比较数字的前后部分,实现了一种有效的解决方案。
1019 General Palindromic Number (20 分)
 

A number that will be the same when it is written forwards or backwards is known as a Palindromic Number. For example, 1234321 is a palindromic number. All single digit numbers are palindromic numbers.

Although palindromic numbers are most often considered in the decimal system, the concept of palindromicity can be applied to the natural numbers in any numeral system. Consider a number N>0 in base b≥2, where it is written in standard notation with k+1 digits a​i​​ as (. Here, as usual, 0 for all i and a​k​​ is non-zero. Then N is palindromic if and only if a​i​​=a​k−i​​ for all i. Zero is written 0 in any base and is also palindromic by definition.

Given any positive decimal integer N and a base b, you are supposed to tell if N is a palindromic number in base b.

Input Specification:

Each input file contains one test case. Each case consists of two positive numbers N and b, where 0 is the decimal number and 2 is the base. The numbers are separated by a space.

Output Specification:

For each test case, first print in one line Yes if N is a palindromic number in base b, or No if not. Then in the next line, print N as the number in base b in the form "a​k​​ a​k−1​​ ... a​0​​". Notice that there must be no extra space at the end of output.

Sample Input 1:

27 2

Sample Output 1:

Yes
1 1 0 1 1

Sample Input 2:

121 5

Sample Output 2:

No
4 4 1

解题思路
  题目大意:给定一个N和b,求N在b进制下,是否是一个回文数(Palindromic number)。其中,0<N,b<=10^9。
  使用int作为基本类型就足够了,然后进行进制转换,需要注意的是,b进制比较大,可能得到的不是一个单位数,比如16进制下的10~15。可以用char进行存储,然后比较。或者用一个的二维数组进行比较也行。

但是后来发现用char,数字+'0'可能会超出ascii表示的范围,有一个测试点就是过不去。

最终选择用vector<int>,很方便。

 

典型测试样例:

6817 16
Yes
1 10 10 1
187521254 1000000
No
187 521254

AC代码:

#include<bits/stdc++.h> 
using namespace std;
int main(){
    int d,b;
    cin>>d>>b;
    char s[1005];
    int k=1;
    while(d>0){
        s[k++]=d%b+'0';
        //cout<<d%b<<endl;
        d=d/b;
    }
    k--; 
    //cout<<d<<endl;
    int middle=int((1+k)/2);
    int f=1;
    for(int i=1;i<=middle;i++){
        if(s[i]!=s[k+1-i]){
            f=0;
            break;
        }
    }
    if(f){
        cout<<"Yes"<<endl;
    }else{
        cout<<"No"<<endl;
    }
    for(int i=k;i>=1;i--){
        cout<<s[i]-'0';//可能b的进制比较大,所以要-'0'输出 
        if(i!=1){
            cout<<" ";
        }
    }
    return 0;
}

 

 

要判断个数属于2到16进制中的哪个进制,需要明确的是,数字本身并不属于某种进制,而是其表示形式在不同的进制下可能具有特定的特征。例如,在某些进制下,个数的表示可能是回文结构[^2],而在其他进制下则不是。因此,判断个数在哪些进制下具有特定性质(如回文结构)通常涉及对每个进制下的表示进行分析。 ### 判断个数在不同进制下的表示 要判断个数在某个进制下的表示是否具有特定性质,通常需要将该数转换为该进制下的字符串表示,然后对该字符串进行分析。例如,判断个数在某个进制下是否是回文数的过程可以分为以下步骤: 1. **将十进制数转换为指定进制的字符串表示**。 2. **判断该字符串是否满足回文条件**(或其他条件)。 #### 示例代码:将十进制数转换为任意进制的字符串表示 ```python def convert_to_base(n, base): if n == 0: return '0' digits = [] while n > 0: remainder = n % base if remainder < 10: digits.append(str(remainder)) else: digits.append(chr(ord('A') + remainder - 10)) n //= base return ''.join(reversed(digits)) ``` #### 示例代码:判断个字符串是否是回文 ```python def is_palindrome(s): return s == s[::-1] ``` #### 示例代码:判断个数在哪些进制下是回文数 ```python def check_palindromes_in_bases(n): palindromic_bases = [] for base in range(2, 17): converted = convert_to_base(n, base) if is_palindrome(converted): palindromic_bases.append(base) return palindromic_bases ``` ### 示例运行 假设输入的数字是 `17`,则其在不同进制下的表示如下: - 二进制:10001(是回文) - 八进制:21(不是回文) - 十六进制:11(是回文) 因此,`17` 在二进制和十六进制下是回文数[^2]。 ### 总结 要判断个数在2到16进制中的哪些进制下具有特定性质,需要将其转换为该进制的字符串表示,并对该字符串进行分析。通过遍历所有进制(2到16),可以确定该数在哪些进制下满足特定条件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蔡军帅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值