洛谷 P1207 [USACO1.2]雙重回文數 Dual Palindromes
阿新 • • 發佈:2018-12-01
題目描述
如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“迴文數”。例如,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
說明
題目翻譯來自NOCOW。
USACO Training Section 1.2
.
.
.
.
.
.
分析
要從s+1開始列舉!!!!
.
.
.
.
.
程式:
#include<iostream> #include<cstdio> using namespace std; int b; string work(int x) { string zfc=""; char bz[1]; int mod; while (x!=0) { mod=x%b; bz[0]=(char)mod+'0'; zfc=bz[0]+zfc; x=x/b; } return zfc; } bool check(string s) { int l=s.length(),bz=0; if (l==2) { if (s[0]!=s[1]) return false; else return true; } for (int i=l;i>=1;i--) s[i]=s[i-1]; for (int i=1;i<=l/2;i++) if (s[i]!=s[l-i+1]) { bz=1; break; } if (bz==1) return false; return true; } int main() { int n,w; scanf("%d%d",&n,&w); w++; while (n!=0) { int bz=0; string zf; for (b=2;b<=10;b++) { zf=work(w); if (check(zf)==true) bz++; if (bz==2) break; } if (bz==2) { cout<<w<<endl; n--; } w++; } return 0; }