关于“友好号码”的Java程序

时间:2017-03-30 12:18:58

标签: java

我正在进行一项关于所谓“友好号码”的作业,其定义如下:如果最左边的数字可被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;

    }
}

5 个答案:

答案 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
}