USACO - 1.2.4 - Palindromic Squares

转载请注明出处

摘要:模拟 , 回文数 , 进制转换

一. 题目翻译

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进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。

3. SAMPLE:
          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


二.  题解
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;
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值