题目描述
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,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大的前n个符合题意的数”,而不是“比S大的n个数中符合题意的数”,估计也就我会看错了...
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n, S, tot, b, no, ans; 5 string s, ns="0123456789"; 6 7 void change(int x) { 8 s.clear(); 9 while (x>0) { 10 s+=ns[x%b]; 11 x/=b; 12 } 13 reverse(s.begin(), s.end()); 14 } 15 16 bool check() { 17 for (size_t i=0;i<s.length();++i) 18 if (s[i]!=s[s.length()-i-1]) 19 return false; 20 return true; 21 } 22 23 int main() { 24 cin >> n >> S; 25 for (int i=S+1;ans<n;++i) { 26 tot=0, no=i; 27 for (b=2;b<=10;++b) { 28 change(no); 29 if (check()) { 30 tot++; 31 } 32 } 33 if (tot>=2) { 34 printf("%d\n", i); 35 ans++; 36 } 37 } 38 }
时间: 2024-10-12 17:44:42