用十进制 十二禁止 16进制 各位之和都为22的的程序,该如何设计?
这是利用循环暴力:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static List<Integer> findNumbers() {
List<Integer> result = new ArrayList<>();
for (int i = 1000; i < 10000; i++) {
int decimalSum = getDecimalSum(i);
int hexadecimalSum = getHexadecimalSum(i);
int duodecimalSum = getDuodecimalSum(i);
if (decimalSum == 22 && hexadecimalSum == 22 && duodecimalSum == 22) {
result.add(i);
}
}
return result;
}
private static int getDecimalSum(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
private static int getHexadecimalSum(int num) {
String hexString = Integer.toHexString(num);
int sum = 0;
for (char ch : hexString.toCharArray()) {
sum += Character.digit(ch, 16);
}
return sum;
}
private static int getDuodecimalSum(int num) {
String duodecimalString = Integer.toString(num, 12);
int sum = 0;
for (char ch : duodecimalString.toCharArray()) {
sum += Character.digit(ch, 12);
}
return sum;
}
public static void main(String[] args) {
List<Integer> numbers = findNumbers();
System.out.println("和为22的这样的四位数有: " + numbers);
}
}
输出结果为:
这个代码你可以试下:
public class NumberFinder {
public static void main(String[] args) {
findNumbersWithSum(22);
}
public static void findNumbersWithSum(int sum) {
for (int i = 1000; i <= 9999; i++) {
if (calculateSum(i, 10) == sum && calculateSum(i, 12) == sum && calculateSum(i, 16) == sum) {
System.out.println("Number: " + i);
System.out.println("Decimal: " + i);
System.out.println("Duodecimal: " + Integer.toString(i, 12));
System.out.println("Hexadecimal: " + Integer.toString(i, 16));
System.out.println();
}
}
}
public static int calculateSum(int number, int base) {
int sum = 0;
while (number > 0) {
sum += number % base;
number /= base;
}
return sum;
}
}
看以下的代码:
public class Test {
private List<Integer> list;
public static void main(String[] args) {
try {
Field field = Test.class.getDeclaredField("list");
System.out.println(field.getGenericType());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
运行后,会输出:
java.util.List<java.lang.Integer>
泛型的类型,确实拿到了,这是怎么回事?
由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。但是在编译java源代码成 class文件中还是保存了泛型相关的信息,这些信息被保存在class字节码常量池中,使用了泛型的代码处会生成一个signature签名字段,通过签名signature字段指明这个常量池的地址,通过反射获取泛型参数类型,归根结底都是来源于这个signature属性。