題目描述
我們把從左往右和從右往左念起來相同的數字叫做迴文數。例如,75457就是一個迴文數。
當然某個數用某個進製表示不是迴文數,但是用別的進製表示可能就是迴文數。
例如,17是用十進制表示的數,顯然它不是一個迴文數,但是將17用二進制表示出來是10001,顯然在二進制下它是一個迴文數。
現在給你一個用十進制表示的數,請你判斷它在2~16進制下是否是迴文數。
輸入
輸入包含多組測試數據。每組輸入一個用十進制表示的正整數n(0<n<50000),當n=0時,輸入結束。
輸出
對於每組輸入,如果n在2~16進制中的某些進製表示下是迴文數,則輸出“Number i is palindrom in basis ”,在後面接着輸出那些進制。其中i用n的值代替,後面輸出的進制中,每兩個數字之間空一個。
如果n在2~16進制的表示下都不爲迴文數,則輸出“Number i is not a palindrom”,其中i用n的值代替。
樣例輸入
17
19
0
樣例輸出
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
思路
主要問題:
- 使用什麼樣的數據類型
- 進制的轉換
- 迴文數的判斷
解決方案:
- 這裏不可以用int之類的類型來存儲,因爲50000的二進制高達16位,所以要用數組來存儲進制轉換後的數據
- 進制的轉換
int aim[20];//用來存儲轉換後的數據
int lenth = 0;//記錄aim的長度
while(n)//將n轉換成i進制
{
aim[lenth++] = n%i;//取餘操作
n/=i;//自除操作
}
- 迴文數判斷的兩種思路(因爲我們使用了數組,所以採用第二種方案)
//將回文數看作整形數據(在這裏010就是10,10不是迴文數)
bool is_palindromic(int num)
{
int ans=0,copy=num;
while(copy)
{
ans*=10;
ans+=copy%10;
copy/=10;
}
return ans==num?true:false;
}
//將回文數看作字符串(這樣的話010也是迴文數)
bool is_palindromic(string s)
{
int l=0,r=s.length()-1;
while(l<=r)
{
if(s[l++]==s[r--]) continue;
else return false;
}
return true;
}
程序主幹:
int main(){
unsigned int n;
bool flag;
int i;
while(true){
cin >> n;
if(n==0) break;
flag = false;
for(i=2;i<=16;i++){
if(judge(n,i)==true){
if(flag==false){
cout << "Number "<<n<<" is palindrom in basis " << i;
flag = true;
}else{
cout << " " << i;
}
}
}
if(flag == false) cout << "Number "<< n <<" is not a palindrom";
cout << endl;
}
}
題解
#include<iostream>
using namespace std;
bool judge(unsigned int n,int i){
int aim[20];
int lenth = 0;
while(n)
{
aim[lenth++] = n%i;
n/=i;
}
int l=0,r=lenth-1;
while(l<=r){
if(aim[l++]==aim[r--])continue;
else return false;
}
return true;
}
int main(){
unsigned int n;
bool flag;
int i;
while(true){
cin >> n;
if(n==0) break;
flag = false;
for(i=2;i<=16;i++){
if(judge(n,i)==true){
if(flag==false){
cout << "Number "<<n<<" is palindrom in basis " << i;
flag = true;
}else{
cout << " " << i;
}
}
}
if(flag == false) cout << "Number "<< n <<" is not a palindrom";
cout << endl;
}
}