PAT1019 General Palindromic Number (20 分)
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 in base , where it is written in standard notation with digits as . Here, as usual, for all i and is non-zero. Then N is palindromic if and only if = 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 is the decimal number and 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 " … ". 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
解析
這題首先要進行進位制轉換,再判斷是否為迴文數字。 進位制轉換程式碼:(可以看看我的這篇blog演算法筆記) 這裡進位制轉換不能把結果放在string裡,因為題目給的2<=base<=。如果是17進位制,怎麼表示16?。題目好像預設是什麼就放什麼,是16,就放16.。所以要用vector<int>儲存每一位。 判斷迴文應該沒問題 Code:
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
bool judge(const vector<int>& word) {
int N = word.size();
for (int i = 0; i < N / 2; i++)
if (word[i] != word[N - i - 1])
return false;
return true;
}
int main()
{
int N, b;
cin >> N >> b;
vector<int> result;
do {
result.push_back(N % b);
N /= b;
} while (N != 0);
cout << (judge(result) ? "Yes" : "No") << endl;
for (int i = result.size()-1; i >=0; i--)
printf("%d%c", result[i], i == 0 ? '\n' : ' ');
}