我正在进行一项关于所谓“友好号码”的作业,其定义如下:如果最左边的数字可被1整除,则最左边的两位数可以被2整除,最左边的数字被认为是友好的三位数可以被3整除,依此类推。 n位本身可以被n整除。
另外,我们需要调用一个方法(正如我在下面的代码中所做的那样或至少尝试过)。它应该打印一个数字是否友好。但是,我的程序打印“整数不友好”。在这两种情况下。根据我的尝试,我知道计数器确实有效。我只是找不到我错过的或做错的事。帮助将不胜感激,并且最好改编下面的代码,因为这是我自己提出来的。
import java.util.Scanner;
public class A5E4 {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("Please enter an integer: ");
int friendlyNumber = in.nextInt();
boolean result = isFriendly(friendlyNumber);
if (result)
{
System.out.println("The integer is friendly");
}
else
{
System.out.println("The integer is not friendly");
}
}
public static boolean isFriendly(int number)
{
int counter = 1;
while (number / 10 >= 1)
{
counter ++;
number = number / 10;
}
boolean check = true;
for (int i = 1; i <= counter; i++)
{
if (number / Math.pow(10, (counter - i)) % i == 0 && check)
{
check = true;
}
else
{
check = false;
}
}
return check;
}
}
答案 0 :(得分:1)
while (number / 10 >= 1){
counter ++;
number = number / 10;
}
在这一点上,你将number
减少到小于10的值。这可能不是你想要的。你应该在这里复制number
。
此外,正确的软件设计会建议您将其提取为专用方法。
private int countDigits(int number){
if(number < 1) throw new IllegalArgumentException();
int n = number;
int counter = 1;
while (n / 10 >= 1){
counter ++;
n = n / 10;
}
return counter;
}
答案 1 :(得分:0)
您需要复制用于查找您的号码有多少位数的号码。否则你改变了数字本身,不知道它是什么。
第二个错误是你将整数除以Math.pow()
,它返回一个double。所以你的结果是双倍的。您想要一个整数来使用模运算符。
public static boolean isFriendly(int number)
{
int counter = 1;
int tmpNumber = number;
while (tmpNumber / 10 >= 1)
{
counter ++;
tmpNumber = tmpNumber / 10;
}
boolean check = true;
for (int i = 1; i <= counter; i++)
{
if ((int)(number / Math.pow(10, (counter - i))) % i == 0 && check)
{
check = true;
}
else
{
check = false;
}
}
return check;
}
答案 2 :(得分:0)
第一个问题是您正在修改要检查的号码的值。所以,如果用149调用你的方法,那么在while循环之后计算数字,它的值将是1.所以,你总是会发现它是不友好的&#39;。假设您修复此问题,以便该号码包含您正在检查的号码。试试这个而不是你的&#39; for&#39;循环:
while ( counter && !( ( number % 10 / counter ) % counter ) )
{
number = number / 10;
counter--;
}
它的工作原理是使用模数或余数运算符取数字的最后一位数,然后将其除以数字位置并检查余数是否为零。如果一切正常,则递减计数器直到它达到零,否则它在计数器为零之前终止。
答案 3 :(得分:-1)
尝试这样的事情(更改isFriendly()
方法):
public static boolean isFriendly(int number)
{
String numberAsString = String.valueOf(number); //Convert the int as a String to make it easier to iterate through
for(int i = 0; i < numberAsString.length(); i++) {
int currentDigit = Character.getNumericValue(numberAsString.charAt(numberAsString.length() - i - 1)); //Iterate over the number backwards
System.out.println(currentDigit); //Print the current digit
if(currentDigit % (i + 1) != 0) {
return false;
}
}
return true;
}
答案 4 :(得分:-1)
简单的方法是转换为字符串,然后检查它是否友好:
public void DoStuff(string firstArgument, string secondArgument)//original method
{
DoStuff(firstArgument, secondArgument, "default value")
}
public void DoStuff(string firstArgument, string secondArgument, string thirdArgument)//new overload of the method
{
//stuff to do
}