Palindromic Squares 迴文平方數 (迴文數 + 進位制轉化)
阿新 • • 發佈:2018-12-12
Description
迴文數是指從左向右念和從右向左念都一樣的數。如12321就是一個典型的迴文數。 給定一個進位制B(2<=B<=20,由十進位制表示),輸出所有的大於等於1小於等於300(十進位制下)且它的平方用 B 進製表示時是迴文數的數。用’A’,’B’……表示10,11等等。
Input
共一行,一個單獨的整數B(B用十進位制表示)。
Output
每行兩個B進位制的符合要求的數字,第二個數是第一個數的平方,且第二個數是迴文數。
Sample Input
10
Sample Output
1 1 2 4 3 9 11 121 22 484 26 676 101 10201 111 12321 121 14641 202 40804 212 44944 264 69696
題意:
輸入 一個 B ,代表幾進位制,然後輸出 所有的 1<= x <= 300 (十進位制下)且它的 平方 用 B 進製表示時是迴文數的數
思路:
暴力 1- 300 之間的數,判斷該數的平方是不是 迴文數,如果是的話,就去輸出該數
轉化進位制數 : 除 B 取 模
while(x)
{
s[cnt++] = x%B;
x /= B;
}
CODE:
不知道這個樣子 printf("%c",ss[i]-10+'A'); 就不對呢,WA 了我好幾次
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> using namespace std; #define memset(a,n) memset(a,n,sizeof(n)) typedef long long LL; LL s[302]; LL ss[302]; LL cnt = 0; LL judge1(LL x,LL y) { LL k = 1; cnt=0; while(x) { s[cnt++] = x%y; x /= y; } for (LL i = 0; i < cnt/2; i++) // 判斷是不是迴文數 if (s[i] != s[cnt-i-1]) { k = 0; break; } if (k == 1) return 1; else return 0; } void judge(LL a,LL b,LL n) { int flag, flagg; char c,cc; flagg = 0; memset(s,0); memset(ss,0); flag = judge1(a,n); if(flag) // 如果是迴文數的話,輸出 { while(b) { ss[flagg++] = b%n; b /= n; } for (LL i = flagg-1; i >= 0; i--) { if (ss[i] <= 9) cout<<ss[i]; else{ c=ss[i]-10+'A'; // !!! 這裡當數大於 10 的時候,只能輸出 A B ... cout<<c; } } cout<<' '; for (LL i = cnt-1; i >= 0; i--) { if (s[i] <= 9) cout<<s[i]; else { cc=s[i]-10+'A'; cout<<cc; } } cout<<endl; } } int main() { ios::sync_with_stdio(false); LL n; cin>>n; for(LL i = 1; i <= 300; i++) { memset(s,0); memset(ss,0); cnt=0; judge(i*i,i,n); } }