USACO dual palindromic 雙重回文數
阿新 • • 發佈:2018-12-16
題目描述
如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“迴文數”。例如,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;
}