1. 程式人生 > >C++ Zoj1078 Palindrom Numbers(迴文數)

C++ Zoj1078 Palindrom Numbers(迴文數)

題目大意:判斷一個十進位制數i轉化為2-16進位制的數是否是迴文數,如果是輸出: Number I is is palindrom in basis X X X

                  否則輸出:Number 19 is not a palindrom

       迴文數:一個數中的數字左右對稱

輸入:

        每行輸入測試資料i,以0結束程式

輸出:

        輸出對應的i是否是迴文數

 

實現程式: 我這裡用了string儲存轉成的進位制數,因為string儲存空間可以隨意改變,隨意新增字元。你也可以用陣列儲存,需要

                   新增一個跟蹤位數的j,缺點:陣列固定空間,如果測試資料小,會浪費空間。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n;
    string str;
    
    while (cin >> n && n) {
        int flag = 0;
        
        cout << "Number " << n << " is ";
        for (int i = 2; i <= 16; i++) {
            int m = n;
            
            // 將n轉成2-16進位制數,存到字串str中
            str.clear();
            while (m) {
                str += (m % i);
                m = m / i;
            }
            
            // 判斷轉成的進位制數是否是迴文數(數字左右對稱)
            int j;
            int len = (int)str.size();
            for (j = 0; j < ( len / 2); j++)
            {
                if (str[j] != str[len - 1 - j])
                    break;
            }
            
            if (j == len / 2) { // 是迴文數
                if (!flag) { // 輸出第一次滿足迴文數的進位制數
                    flag = 1;
                    cout << "palindrom in basis " << i;
                } 
                else 
                    cout << " " << i;
            }
        }
        if (!flag)
            cout << "not a palindrom";
        cout << endl;
    }
    return 0;
}

 執行結果: