题目描述
回文数是指数字从前往后读和从后往前读都相同的数字。
例如数字 12321 就是典型的回文数字。
现在给定你一个整数 B,请你判断 1∼300 之间的所有整数中,有哪些整数的平方转化为 B 进制后,其 B 进制表示是回文数字。
输入格式
一个整数 B。
输出格式
每行包含两个在 B 进制下表示的数字。
第一个表示满足平方值转化为 B 进制后是回文数字那个数,第二个数表示第一个数的平方。
所有满足条件的数字按从小到大顺序依次输出。
数据范围
2≤B≤20,
对于大于 9 的数字,用 A 表示 10,用 B 表示 11,以此类推。
输入样例:
10
输出样例:
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~300十进制的数(我们设为i)的平方,转化为B进制后,是否是回文数字
如果是,那么就输出B进制下的i和B进制下的i * i;
那思路不就来了嘛
1:求i的平方,也就是 i * i -----一个for就可以解决
2:把i * i转化为b进制 -----短除法就可以解决(看y总直播,学短除法)
3:看这个数是否是回文数字 -----双指针可以解决
Java代码
/*题目含义:检查10进制数的平方 转化为b进制 是否为回文数字*/
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int b = in.nextInt();
for(int i = 1; i <= 300; i ++){
String num = base(i * i, b);
if(check(num)){
System.out.println(base(i,b) + " " + num);
}
}
}
private static String base(int n, int b ){ //短除法,把十进制转坏为B进制
StringBuilder sb = new StringBuilder(); //只有StringBuilder才有append(),reverse()方法
while(n != 0){ //先求余数
if(n % b <= 9) sb.append(n%b);
else sb.append((char)(n%b - 10 + 'A')); //int + char 会自动转化为int,所以我们需要强制转化
n /= b; //更新n的值
}
return sb.reverse().toString();
}
private static boolean check(String num){ //双指针算法检查是否是回文数字
for(int i = 0, j = num.length() - 1; i < j; i ++, j --)
{
if(num.charAt(i) != num.charAt(j)) return false;
}
return true;
}
}
问题1:什么是短除法
模仿我们把十进制转化为其他进制的过程,我们需要先求余数,在更新n的值;
比如说把十进制的123,转化为3进制的数;那就让123不断的除以3求余数,得11120
自己在草稿纸上试一下,就可以知道短除法是先求余数,在更新n的值;
问题2:什么是回文数字
正着念和倒着念是一致得
我们可以直接双指针,一个在头部,一个在尾部,如果不相等的话说明就不是回文数字,相等的话就继续比较
问题3:为什么Java中要用StringBuilder
因为只有StringBuilder和StringBuilder才有append(),reverse()方法,String中是没有的
所以String,StringBuilder,StringBuilder之间的区别除了单例,执行效率,线程安全是不一样的,方法的个数也是不一样的
问题4:(char)(n%b - 10 + ‘A’)是什么意思
比如说我们b = 20,n = 11,11除以20商是0,余数是11,这样余数就上双了,我们不能直接插入到字符串中去,否则会多一位,
所以看题目要求,需要把余数 - 10 + ‘A’,这样保证和原来的数字是一致的,而且可以插入到字符串中去
n%b - 10是int类型,’A’是char类型,int类型的优先级大于char,所以int + char会自动转化为int,需要我们强制类型转化