codevs 1390 回文平方数 USACO
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 青铜 Bronze
题目描述 Description
回文数是指从左向右念和从右像做念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20十进制),输出所有的大于等于1小于等于300且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
输入描述 Input Description
共一行,一个单独的整数B(B用十进制表示)。
输出描述 Output Description
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。
样例输入 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
数据范围及提示 Data Size & Hint
一道舒心模拟题 点击传送
#include <iostream> #include <cstring> #include <cstdio> #include <string> using namespace std; string a,b,c; int B,i,j; int pd(int k) { a.clear(); while(k) { a+=k%B; k/=B; } int l=0,r=a.length()-1; while(l<r) { if(a[l++]!=a[r--]) return 0; } return 1; } void get(int q) { b.clear(); while(q) { int d=q%B; if(d>=10) b+=char(d+55); else b+=d; q/=B; } } void geta(int w) { c.clear(); while(w) { int e=w%B; if(e>=10) c+=char(e+55); else c+=e; w/=B; } } int main() { scanf("%d",&B); for(i=1;i<=300;++i) { if(pd(i*i)) { get(i); geta(i*i); for(j=b.length()-1;j>=0;--j) if(b[j]>='A'&&b[j]<='Z') cout<<b[j]; else cout<<int(b[j]); cout<<" "; for(j=c.length()-1;j>=0;--j) if(c[j]>='A'&&c[j]<='Z') cout<<c[j]; else cout<<int(c[j]); cout<<endl; } } return 0; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。