USACO - Chapter1 Section 1.2 - Dual Palindromes

Dual Palindromes

題目描述

如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“迴文數”。例如,12321就是一個迴文數,而77778就不是。當然,迴文數的首和尾都應是非零的,因此0220就不是迴文數。

事實上,有一些數(如21),在十進制時不是迴文數,但在其它進制(如二進制時爲10101)時就是迴文數。

編一個程序,從文件讀入兩個十進制數N (1 <= N <= 15)S (0 < S < 10000)然後找出前N個滿足大於S且在兩種或兩種以上進制(二進制至十進制)上是迴文數的十進制數,輸出到文件上。

本問題的解決方案不需要使用大於32位的整型

輸入輸出格式

輸入格式:
只有一行,用空格隔開的兩個數N和S。

輸出格式:
N行, 每行一個滿足上述要求的數,並按從小到大的順序輸出。

輸入輸出樣例

輸入樣例#1:
3 25
輸出樣例#1:
26
27
28

主要的方法是求餘計算每個進制之下的數,再遍歷判斷是否是迴文。水題。

Code

#include<iostream>
using namespace std;
char s[15][1000]; // s[i] 表示 i 進制下的這個數
int main()
{
    int n,st,ans = 0,cnt = 0;
    cin >> n >> st;
    for (int i=st+1;ans < n;i++)
    {
        int p = 0; // 迴文次數
        for (int j=2;j<=10;j++)
        {
            bool flag = true;
            int temp = i;
            while(temp)
            {
                s[j][cnt] = (temp % j) + 48;
                temp /= j;
                cnt++;
            }
            for (int k=0;k<cnt/2;k++)
            {
                if (s[j][k] != s[j][cnt-k-1])
                {
                    flag = false;
                    break;
                }
            }
            cnt = 0;
            if (flag) p++;
            if (p == 2)
            {
                ans++;
                cout << i << endl;
                break;
            }
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章