1. 程式人生 > >USACO dual palindromic 雙重回文數

USACO dual palindromic 雙重回文數

題目描述

如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“迴文數”。例如,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

解題思路

這道題就是“迴文數平方”一題的拓展版,但是主要的進位制轉換還是一樣的。
進位制轉換:https://blog.csdn.net/johnwayne0317/article/details/84980149
迴文數平方:https://blog.csdn.net/johnwayne0317/article/details/84979712

程式碼

#include <bits/stdc++.h>
using
namespace std; int sum; int a[100]; int k; int basecnt; int jin; void change(int n){ basecnt=0; while(n!=0){ a[basecnt]=n%jin; n/=jin; basecnt++; } return ; } int main(){ int n; cin>>sum>>n; int tmp; bool tf=false; int cnt=0; int cnt2=n+1; while(cnt<sum){ int cnt3=0; for
(int i=2;i<=10;i++){ memset(a,0,sizeof(a)); jin=i; change(cnt2); tf=false; for(int j=0;j<basecnt;j++){ if(a[j]!=a[basecnt-1-j]){ tf=true; } } if(tf==false){ if(cnt3==1){ cout<<cnt2<<endl; cnt++; break; }else{ cnt3++; } } } cnt2++; } return 0; }