1. 程式人生 > >PAT1019 General Palindromic Number (20 分)

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 N

>0N>0 in base b2b≥2, where it is written in standard notation with k+1k+1 digits aia_i as i=0k(aibi)∑_{i=0}^{k}(a_ib_i). Here, as usual, 0ai<b0≤a_i<b for all i and aka_k is non-zero. Then N is palindromic if and only if aia_i=akia_{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

<N1090<N≤10^9 is the decimal number and 2b1092≤b≤10^9 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 "aka_k ak1a_{k−1}a0a_{​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

解析

這題首先要進行進位制轉換,再判斷是否為迴文數字。 進位制轉換程式碼:(可以看看我的這篇blog演算法筆記) 這裡進位制轉換不能把結果放在string裡,因為題目給的2<=base<=10910^9。如果是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' : ' ');
}