题目描述:
题目链接:
题目思路:
直接调用 java 内部 API 或者手写进制转换,再进行逐位求和,暴力判断到 2023 的结束。 答案:215040
算法标签: 模拟,找规律
Code:
/*
* 解法 1:
* 利用 api
*/
public class Main {
public static void main(String[] args) {
int cnt = 0; //记录成立个数
int num = 1; //判断数字
while (true){
if(isB(num) && isO(num) && isD(num) && isH(num)){//2, 8, 10, 16 进制判断
cnt++;
}
if(cnt == 2023){ // 到 2023 个成立的数输出并退出
System.out.println(num);
break;
}
num++;
}
}
public static boolean isD(int num){
int sum = 0;
int t = num;
while (t != 0){
sum += t % 10;
t /= 10;
}
return num % sum == 0;
}
public static boolean isB(int num){
int sum = 0;
String t = Integer.toBinaryString(num); // api 转换后是 String 类型需要用字符串操作
for(int i = 0; i < t.length(); i++){
sum += t.charAt(i) - '0';
}
return num % sum == 0;
}
public static boolean isO(int num){
int sum = 0;
String t = Integer.toOctalString(num);
for(int i = 0; i < t.length(); i++){
sum += t.charAt(i) - '0';
}
return num % sum == 0;
}
public static boolean isH(int num){
int sum = 0;
String t = Integer.toHexString(num);
for(int i = 0; i < t.length(); i++){
if(t.charAt(i) >= 'a'){
sum += t.charAt(i) - 'a' + 10; // 字母情况特殊判断
}else{
sum += t.charAt(i) - '0';
}
}
return num % sum == 0;
}
}
/*
* 解法 2:
* 手写进制转换判断
*/
public class Main {
public static void main(String[] args) {
int cnt = 0;
int num = 1;
while (true) {
if (check(2, num) && check(8, num) && check(10, num) && check(16, num)) {
cnt++;
}
if (cnt == 2023) {
System.out.println(num);
break;
}
num++;
}
}
public static boolean check(int base, int num){ // 进制位, 转换数
int t = num;
int sum = 0;
while (t != 0){
sum += t % base;
t /= base;
}
return num % sum == 0;
}
}
注:第 14 届 蓝桥杯 java b组 省赛