【问题标题】:Method that determines if a number is 'insipid'确定数字是否“平淡”的方法
【发布时间】:2012-10-12 01:58:16
【问题描述】:

所以我的任务是编写一个程序来确定一个数字是否平淡。意思是,如果你拿一个数字: 例如 57,然后将每个数字的平方相加,5*5 + 7*7,现在就是新数字:74。然后你一直这样做,直到你得到 58,这意味着这个数字不是平淡无奇的,或者你得到 1,这意味着这个数字是平淡的。 58 只会重复一个总是在 58 结束的序列。

所以我想尝试一些基本的递归,但也许我误解了这里递归的使用。

以下是我写的两个相关方法:

public static boolean insipid(int num){

    int dig1 = 0, dig2 = 0, dig3 = 0; // num = 159 for example, dig1 would be 1. Default is 0 in case of a 2 digit number, dig1*dig1 = 0
    if(num == 58){ //The number is not insipid
        return false;
    }
    if(num == 1){ // the number is insipid
        return true;
    }

    if (num < 10){
        insipid(num * num);
    }
    if(num>99){
        dig1 = (int)(num / 100);
        dig2 = (int)((num - 100)/10);
        dig3 = num - (((int)(num / 10))*10);
        insipid(squaresum(dig1,dig2,dig3));
    }
    else{
        dig2 = (int)(num/10); //the 10s place
        dig3 = num - (((int)(num/10)) * 10); // the 1's place
        insipid(squaresum(dig1, dig2,dig3)); //dig1 = 0 so I just pass it along with it.
    }
}

public static int squaresum(int dig1, int dig2, int dig3){
    //Returns the sum of three digits squared.
    return (dig1 * dig1) + (dig2 * dig2) + (dig3 + dig3);
}

它给了我一个错误,说只要我提供一个数字,Insipid() 就必须返回一个布尔值。但我知道对于任何数字,它总是最终会解析为 58 或 1。所以不应该总是返回 true 或 false 以便返回布尔值并且错误无效?显然情况并非如此,而是我如何看待它。是不是这里使用的递归无效?

另外,如果您对我如何清理它有任何建议,我不介意严厉批评,我的 java 不是很好。

【问题讨论】:

  • 在提出新问题之前,请接受您之前问题的正确答案。
  • 一方面,你不会在平淡无奇的情况下返回任何东西。也许return insipid(....) 应该可以消除编译时错误。
  • 我假设你已经意识到了这一点,但是 dig2 = (int)((num - 100)/10);确保您的算法不适用于任何大于 199 的数字。

标签: java compiler-errors


【解决方案1】:

如果您采用您的解决方案,唯一缺少的是来自对incipid 的递归调用的返回语句。

【讨论】:

    【解决方案2】:

    更新你平淡如下。用return 声明的方法在所有情况下都必须返回值。如果您的方法达到第二个 else ,即如果 number 不是 1 和 58,则您的方法不会返回任何值。

    public static boolean insipid(int num){
      boolean returnValue = false;
      if(num == 58){ //The number is not insipid
       //do nothing
      } if(num == 1){ // the number is insipid
        returnValue = true;
      }else{
        int dig1 = 0, dig2 = 0, dig3 = 0; // num = 159 for example, dig1 would be 1. Default is 0 in case of a 2   digit number, dig1*dig1 = 0
        if (num < 10){
            returnValue = insipid(num * num);
        }
        else if(num>99){
            dig1 = (int)(num / 100);
            dig2 = (int)((num - 100)/10);
            dig3 = num - (((int)(num / 10))*10);
            returnValue = insipid(squaresum(dig1,dig2,dig3));
        }
        else{
            dig2 = (int)(num/10); //The 10s place
            dig3 = num - (((int)(num/10)) * 10); //the 1s place
            returnValue = insipid(squaresum(dig1, dig2,dig3)); //dig1 = 0 so I just pass it along with it.
        }
      }
      return returnValue ;
    }
    

    请注意:我只是试图回答您关于退货问题的问题。

    【讨论】:

      【解决方案3】:

      除了 Yogendra Singh 的回答之外,您还错误地计算了数字:例如与

      dig2 = (int)((num -100)/10);
      

      你假设百位数是 1。试试

      dig2 = (int)((num - dig1 * 100)/10);
      

      dig3 也是如此。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多