迴文數與進制轉換-課程作業

題目描述

我們把從左往右和從右往左念起來相同的數字叫做迴文數。例如,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

思路

主要問題:

  1. 使用什麼樣的數據類型
  2. 進制的轉換
  3. 迴文數的判斷

解決方案:

  1. 這裏不可以用int之類的類型來存儲,因爲50000的二進制高達16位,所以要用數組來存儲進制轉換後的數據
  2. 進制的轉換
int aim[20];//用來存儲轉換後的數據
int lenth = 0;//記錄aim的長度
 while(n)//將n轉換成i進制
 {
     aim[lenth++] = n%i;//取餘操作
     n/=i;//自除操作
 }
  1. 迴文數判斷的兩種思路(因爲我們使用了數組,所以採用第二種方案)
//將回文數看作整形數據(在這裏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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章