【问题标题】:"Magic Number" exercise in javajava中的“幻数”练习
【发布时间】:2012-10-11 06:21:51
【问题描述】:

所以我的任务是找到一个数字范围内的所有“幻数”(由用户输入)。幻数是一个数,其因数(除了它自己)总和等于该数。所以 6 将是一个神奇的数字,因为它本身的因素是 1,2 和 3,总和为 6。我已经盯着这段代码一段时间了,我一生都无法弄清楚为什么它不会打印出来神奇的数字。任何帮助将不胜感激。

public class MagicNumber {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.print("What is the top of the range?");
    int range = IO.readInt();
    if (range <= 0 ) {
        IO.reportBadInput();
    }
    int sumOfFactors = 0;
    for (int i = 1 ; i <= range ; i++) {
        for (int m = 1 ; m < i; m++) {
            if (i % m == 0) {
                sumOfFactors = sumOfFactors + m;
            }
            if (sumOfFactors == i) {
                System.out.println(i);
                    }
            }
        }
    }
}

【问题讨论】:

  • 别看它,调试它。要么通过调试器运行它,要么大量使用 println 语句来找出它的行为方式。
  • 只是出于好奇,这个属性是不是通常所说的perfect numbers?例如,28 的质因数是 2(重​​数 2)和 7,但 28 的真因数是 1、2、4、7 和 14(总和为 28)。 28 是一个“神奇的数字”吗?
  • 我可以看到的一件事是您没有将sumOfFactors 重置为零。
  • Tedd- 是的,这和完美数字是一回事。

标签: java for-loop magic-numbers


【解决方案1】:

您正在测试 sumOfFactors == i 是否仍在对因子求和。您需要将其移到m 循环之外。然后你需要在每次通过i循环开始m循环之前将sumOfFactors设置为0,而不是在循环开始时设置一次。

【讨论】:

    【解决方案2】:

    我认为您需要在第一个 for 循环中初始化 int sumOfFactors = 0; 并将第二个 if 移出第二个 for 循环 因为您需要将总因子的总和与当前数字进行比较如下:

    for (int i = 1 ; i <= range ; i++) {
        int sumOfFactors = 0;  //<--Moved inside
        for (int m = 1 ; m < i; m++) {
            if (i % m == 0) {
                sumOfFactors = sumOfFactors + m;
            }
         }
         if (sumOfFactors == i) {  // <-- moveed out of second loop
           System.out.println(i);
         }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

       public class MagicNumber {
      
          /**
           * @param args
           */
          public static void main(String[] args) {
              // TODO Auto-generated method stub
              System.out.print("What is the top of the range?");
              int range = IO.readInt();
              if (range <= 0 ) {
                  IO.reportBadInput();
              }
      
              for (int i = 1 ; i <= range ; i++) {
         int sumOfFactors = 0;
                  for (int m = 1 ; m < i; m++) {
                      if (i % m == 0) {
                          sumOfFactors = sumOfFactors + m;
                      }
          }
                      if (sumOfFactors == i) {
                          System.out.println(i);
                              }
      
                  }
              }
          }
      

      【讨论】:

      • 我不这么认为,因为我希望它打印出该范围内的每个幻数。因此,对于介于 1 和范围之间的每个数字,我想检查它是否是一个幻数,然后将其打印出来。
      • OP 正在尝试打印&lt;= range 的幻数(一些ms)。
      【解决方案4】:

      只是参考了这个幻数程序http://getprogramcode.com/2013/11/java-program-to-check-for-a-magic-number/并想到了写这个。

      public class HelloWorld{
      
           public static void main(String []args){
              static int number=5432;
              while(number>9){
                  int tot = calculateSum(number);
                  System.out.println(tot);
              }
           }
      
           private static int calculateSum(int num){
               int sum = 0;
               while (num > 0) {
                  int a = num % 10;
                  sum = sum+ a;
                  num = num / 10;
              }
               number = sum;
               return sum;
           }
      }
      

      【讨论】:

        【解决方案5】:
        public class Magic {
        
            public static void main(String[] args) {
                // TODO Auto-generated method stub
        
                int b =778393;
                int e=0,c;
        
                while (b>=10) {
                    while (b>0) {
                        c=b%10;
                        b=b/10;
                        e=e+c;
                    }
                    b=e;
                    e=0;
                    System.out.println(b);
                }
                if (b==1) {
                    System.out.println("It is a magic no."+b);
                } else {
                    System.out.println("Not"+b);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2010-11-06
          • 2017-06-16
          • 1970-01-01
          • 2014-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-20
          相关资源
          最近更新 更多