` 我正在做一个问题,我们应该编写一个读取正整数序列的程序。第一个零终止输入。对于每个输入 N,程序计算最小的基数 B(其中 B≥2),这样当用基数 B 编写时 N 是回文基数。我的代码对于最低的回文基数来说很好,但当我使用更大的数字得到更高的基数时, .ToString 方法没有将我的长整型正确添加到字符串中。它只是添加随机字母和数字。
import java.util.Arrays;
import java.util.Scanner;
public class num5 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String nums[] = in.nextLine().split(" ");
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i].equals("0")) {
System.exit(0);
}
System.out.println(bases(nums[i]));
}
for (String var : nums) {
System.out.println(var);
}
}
public static boolean ispalin(String original) {
String reverse = "";
int length = original.length();
for (int k = (length - 1); k >= 0; k--)
reverse = reverse + original.charAt(k);
if (original.equals(reverse))
return true;
else
return false;
}
public static int bases(String numb) {
for (int i = 2; i < Integer.MAX_VALUE; i++) {
String basecheck = "";
basecheck = Long.toString(Long.parseLong(numb), i);
if (ispalin(basecheck)) {
return i;
}
}
return 0;
}
}
有什么办法可以解决这个问题吗?
要表示给定基数 n 中的数字,您必须有 n 不同的符号。
可能的碱基范围是有限的,并且肯定不会达到
Integer.MAX_VALUE
。实际限制在 Character.MAX_RADIX
中给出,其值为 36
。这就是您应该使用的而不是 Integer.MAX_VALUE
。
public static int bases(String numb) {
for (int i = 2; i < Character.MAX_RADIX; i++) {
String basecheck = "";
basecheck = Long.toString(Long.parseLong(numb), i);
...
public static int base(String num) {
BigInteger b = new BigInteger(num);
BigInteger max = b.divide(BigInteger.TWO);
for (int i = 2; BigInteger.valueOf(i).compareTo(max) <= 0; i++)
if (isPalindrome(b.toString(i)))
return i;
return 0;
}
private static boolean isPalindrome(String str) {
for (int i = 0, j = str.length() - 1; i < j; i++, j--)
if (str.charAt(i) != str.charAt(j))
return false;
return true;
}