转载请注明出处
摘要:模拟 , 回文数 , 进制转换
一. 题目翻译
1. 描述:
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
2. 格式:
PROGRAM NAME: palsquare
INPUT FORMAT:
(file palsquare.in)
共一行,一个单独的整数B(B用十进制表示)。
OUTPUT FORMAT:
(file palsquare.out)
每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。
SAMPLE INPUT:
10
SAMPLE OUTPUT:
1 12 43 911 12122 48426 676101 10201111 12321121 14641202 40804212 44944264 69696
1. 题意理解(将问题分析清楚,大致用什么思路):
这道题目主要考察两个点:a.回文数的判断 b. 进制转换
2. 具体实现(具体实现过程中出现的问题):
程序先计算出要求的进制(base),然后调用进制转换函数(transform())产生base进制数,然后调用判断回文数函数(isP())判断。
3. 启示:
回文数的概念积累一下,进制的转换函数积累一下。
三. 代码
/*
ID:fightin1
LANG:JAVA
TASK:palsquare
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class palsquare {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner in = new Scanner(new BufferedReader(new FileReader("palsquare.in")));
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("palsquare.out")));
String temp = in.nextLine();
int base = 0; // 题目中给出是多少进制
if (temp.charAt(0)<'A'){
base = Integer.parseInt(temp);
} else {
base = temp.charAt(0) - 'A';
}
for (int i=1;i<=300;i++){
String trans = transform(i*i, base); //进制转化
if (isP(trans)){//判断回文
pw.println(transform(i, base)+" "+transform(i*i, base));
}
}
pw.close();
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 将参数num 转换为base进制数, 以一个string返回
*/
public static String transform (int num,int base){
int backup = num;
String result = "";
while (num!=0){
if (num%base>=10){
char gen = (char)('A' + num%base - 10);
result = gen + result;
}
else {
result = num%base + result;
}
num = num/base;
}
return result;
}
/**
* 判断num是否是回文数
*/
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;
}
}