【问题标题】:Iterate through each digit in a number遍历数字中的每个数字
【发布时间】:2011-02-15 21:15:47
【问题描述】:

我正在尝试创建一个程序来判断给它的数字是否是“Happy Number”。找到一个快乐的数字需要将数字中的每个数字平方,并将每个数字平方的结果相加。

在 Python 中,你可以这样使用:

SQUARE[d] for d in str(n)

但我找不到如何在 Java 中遍历数字中的每个数字。如您所知,我是新手,在 Java 文档中找不到答案。

【问题讨论】:

  • 如果您已完成问题,请接受答案。

标签: java math numbers iteration


【解决方案1】:

您可以使用模 10 运算得到最右边的数字,然后将该数字除以 10 得到下一个数字。

long addSquaresOfDigits(int number) {
    long result = 0;
    int tmp = 0;
    while(number > 0) {
        tmp = number % 10;
        result += tmp * tmp;
        number /= 10;
    }
    return result;
}

你也可以把它放在一个字符串中,然后把它变成一个 char 数组,然后像 Math.pow(charArray[i] - '0', 2.0); 那样遍历它

【讨论】:

  • @Isaac Lewis:添加了一些(未经测试的)代码,我认为它可以让你得到每个数字的平方相加的结果。
  • 您需要修复“数字/10”才能分配到某处。
  • 啊,请不要使用 Math.pow 来求平方。 result += ((number%10) * (number % 10)) 会更好(或者使用一个额外的变量来避免双重%)。我想你的number / 10 应该是number /= 10
  • 良好的观察达伦和保罗。
【解决方案2】:

假设数字是以整数开头:

int num = 56;
String strNum = "" + num;
int strLength = strNum.length();
int sum = 0;

for (int i = 0; i < strLength; ++i) {
  int digit = Integer.parseInt(strNum.charAt(i));
  sum += (digit * digit);
}

【讨论】:

    【解决方案3】:

    我想知道哪种方法可以最快地将正数拆分为 Java 中的数字,字符串 vs 取模

      public static ArrayList<Integer> splitViaString(long number) {
    
        ArrayList<Integer> result = new ArrayList<>();
        String s = Long.toString(number);
    
        for (int i = 0; i < s.length(); i++) {
          result.add(s.charAt(i) - '0');
        }
        return result; // MSD at start of list
      }
    

      public static ArrayList<Integer> splitViaModulo(long number) {
    
        ArrayList<Integer> result = new ArrayList<>();
    
        while (number > 0) {
          int digit = (int) (number % 10);
          result.add(digit);
          number /= 10;
        }
        return result; // LSD at start of list
      }
    

    通过传递Long.MAX_VALUE 10,000,000 次测试每个方法,字符串版本耗时 2.090 秒,模数版本耗时 2.334 秒。 (在 Eclipse Neon 中运行的 64 位 Ubuntu 上的 Oracle Java 8)

    所以真的不是很多,但我有点惊讶 String 更快

    【讨论】:

      【解决方案4】:

      在上面的例子中我们可以使用:

      int digit = Character.getNumericValue(strNum.charAt(i));
      

      而不是

      int digit = Integer.parseInt(strNum.charAt(i));
      

      【讨论】:

      • 点评来源: 什么例子?你能编辑你的问题并更准确吗?答案的顺序可能会根据他们的投票而改变。
      【解决方案5】:

      您可以将整数转换为字符串并遍历字符串中的每个字符。当你这样做时,把那个字符变成一个整数

      【讨论】:

        【解决方案6】:

        此代码返回符合您描述的第一个数字(1 之后)。

        public static void main(String[] args) {
            int i=2;
            // starting the search at 2, since 1 is also a happy number
            while(true) {
                int sum=0;
                for(char ch:(i+"").toCharArray()) { // casting to string and looping through the characters.
                    int j=Character.getNumericValue(ch);
                    // getting the numeric value of the current char.
                    sum+=Math.pow(j, j);
                    // adding the current digit raised to the power of itself to the sum.
                }
                if(sum==i) {
                    // if the sum is equal to the initial number
                    // we have found a number that fits and exit.
                    System.out.println("found: "+i);
                    break;
                }
                // otherwise we keep on searching
                i++;
            }
        }
        

        【讨论】:

        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
        • 对不起,这是我的第一个答案
        猜你喜欢
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 2023-04-07
        • 2015-11-19
        • 1970-01-01
        相关资源
        最近更新 更多