我尝试创建一个方法,该方法接受用户输入的数字,测试数字中的每个数字是否为奇数,如果全部为奇数则返回true,如果全部为偶数则返回false。这是代码。
public static boolean allDigitsOdd(int num){
int digits[] = new int[10];
int numDigits = 0;
String numTemp = Integer.toString(num);
while(num > 1){
num = num/10;
numDigits++;
}
numDigits++;
for(int i = 0; i < numDigits; i++){
digits[i] = numTemp.charAt(i) - '0';
System.out.println(digits[i]);
}
for(int i = 0; i < numDigits; i++){
if(digits[i] % 2 == 0){
return(false);
}
if(i == numDigits){
return(true);
}
}
return(true);
}
当我进入&#39; 1234&#39;或者&#39; 1357&#39;,它工作得很好并返回正确的布尔值但是当我输入几乎任何其他内容时,它会给我一个超出范围的&#39; String索引&#39;错误
digits[1] = numTemp.charAt(i) - '0';
答案 0 :(得分:1)
将while(num > 1)
更改为while(num >= 10)
。
否则,它仅适用于以1开头的数字(例如1234和1357),因为对于以2到9开头的数字(例如9436534或4334),您对numDigits
的计算将是过高,导致'String index超出范围'。
最好忘记numDigits
,而只使用numTemp.length()
。
答案 1 :(得分:0)
我会用另一种方式解决。
而不是将你的数字变成一个字符串(它可以给你科学记数值和/或数千个分隔符等),将最后一位数字除以10除以给你一个新数字,就像这样(带递归! ):
public static boolean allDigitsOdd(int num){
if (num < 0) {
throw new IllegalArgumentException("num must be 0 or positive");
}
if (num < 10) { // for 0-9, this is easy
return (num % 2 != 0); // if it isn't even, it's odd
} else { // here comes the fun part
int lastDigit = num % 10; // % is the remainder operation, not the modulo operation
int newNum = num / 10; // because this is how ints work, this chops off the last digit
return (lastDigit % 2 != 0) && allDigitsOdd(newNum); // recursion fun!
// This will only return true if all of the tested digits are odd;
// If there is just one even digit, the && operator returns false
}
}
System.out.println(allDigitsOdd(1242)); // false
System.out.println(allDigitsOdd(73335799)); // true
你可以用二元运算符来做到这一点,但这只会降低它的可读性并且不会那么快。
答案 2 :(得分:0)
您甚至可以将所有内容放入一个简单的循环中:
public static boolean allDigitsOdd(int num)
{
while(num != 0)
{
if(num % 2 == 0)
return false; // last digit is even
num /= 10; // cut of last digit and repeat
}
return true; // all digits were odd
}
这甚至适用于负数!