转载请注明出处
一. 题目翻译
1. 描述:
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
本问题的解决方案不需要使用大于32位的整型
2. 格式:
PROGRAM NAME:dualpal
INPUT FORMAT:
(file dualpal.in)
只有一行,用空格隔开的两个数N和S。
OUTPUT FORMAT:
(file dualpal.out)
N行, 每行一个满足上述要求的数,并按从小到大的顺序输出.
SAMPLE INPUT:
3 25
SAMPLE OUTPUT:
26
27
28
1. 题意理解(将问题分析清楚,大致用什么思路):
类似于上一道题目,题目的核心考查的点还是回文数 。由于题目数据很小,从s开始枚举,判断就可以了。
2. 具体实现(具体实现过程中出现的问题):
参考代码注释。
3. 启示:
和1.2.4的题目很相似,可以一起积累。
三. 代码
/*
ID:fightin1
LANG:JAVA
TASK:dualpal
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class dualpal {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner in = new Scanner(new BufferedReader(new FileReader("dualpal.in")));
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("dualpal.out")));
int times = in.nextInt(); // 题目中的N
int start = in.nextInt(); // 题目中的S
int cnt1 = 0; //用来记录 当前已经发现的满足条件的数,如果cnt1大于times时,则可以停止程序了。
for (int i=start+1;cnt1<times;i++){
int cnt2 = 0; //用来判断当前数支持多少种进制的回文数
for (int j=2;j<=10;j++){
if (isP(transfer(i, j))){
cnt2++;
if(cnt2==2){ //等于两种的时候就可以停止循环了,满足条件。cnt1++
cnt1++;
pw.println(i);
break;
}
}
}
}
pw.close();
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 进制转化
*/
public static String transfer (int num , int base) {
String result = "";
while (num!=0){
result = num%base + result;
num = num/base;
}
return result ;
}
/**
*判断是否是回文数
*/
public static boolean isP(String num){
for (int i=0;i<num.length()/2;i++){
if (num.charAt(i)!=num.charAt(num.length()-1-i)){
return false;
}
}
return true;
}
}