检查数字是否满意的Java程序会产生一个不可能的输出

检查数字是否满意的Java程序会产生一个不可能的输出,java,numbers,runtime-error,Java,Numbers,Runtime Error,我设计了一个程序来输入一个数字并检查它是否快乐 import java.util.*; public class isHappy { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter number: "); int n = sc.nextInt(); int l = String.valueOf(n).

我设计了一个程序来输入一个数字并检查它是否快乐

import java.util.*;

public class isHappy
{
public static void main(String[] args)
{
    Scanner sc = new Scanner(System.in);

    System.out.println("Enter number: ");
    int n = sc.nextInt();

    int l = String.valueOf(n).length();
    int temp=n;

    int midVar=0, addVar=0, i=0;

    while (temp!=4)
    {
        midVar=0;

        for (i=l; i>0; i--)
        {
            addVar = temp/Math.pow(10, i);
            midVar+=Math.sqrt(addVar);
        }

        temp = midVar;

        if (temp==1)
          break;
    }

    if (temp==1)
    {
        System.out.println("Happy number");
    }
    else
    {
        System.out.println("Unhappy number");
    }
}
}
我承认我使用的代码并不完全干净,但它应该可以工作。当然,它不应该产生输出2。是的,就是这样:用户输入数字后,程序在下一行中只显示2。让我带你看一下执行过程

Enter number: //program output 68 //user input 2 //program output 输入number://程序输出 68//用户输入 2//程序输出
我必须补充一点,事实上,我在编译过程中确实遇到了“可能的精度损失”错误,但我不认为这实际上可能是导致无法解释的输出的一个因素。另外,我问这个问题的主要目的不是为了得到关于如何修复代码的答案,而是解释为什么我会得到上述奇怪的输出。

快乐数字根据is:

happy number
是通过以下过程定义的数字:

从任何正整数开始,用数字的平方和替换该数字,并重复该过程,直到该数字等于1(它将保持不变),或在不包括1的循环中无限循环

这个过程以1结尾的数字是快乐数字,而不以1结尾的数字是不快乐数字(或悲伤数字)

例如:

例如,19是快乐的,因为关联的序列是:

1^2+9^2=82

8^2+2^2=68

6^2+8^2=100

1^2+0^2+0^2=1

代码:一些修改以获得满意的数字

 public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    System.out.println("Enter number: ");
    int n = sc.nextInt();

    int l = String.valueOf(n).length();
    int temp = n;

    int midVar = 0, addVar = 0, i = 0;

    while (temp != 4) {
        midVar = 0;

        while (temp != 0) {
            addVar = temp % 10;
            temp = temp / 10;
            midVar += Math.pow(addVar, 2);
        }
        temp = midVar;
        System.out.println(midVar);


        if (temp == 1) {
            break;
        }
    }

    if (temp == 1) {
        System.out.println("Happy number");
    } else {
        System.out.println("Unhappy number");
    }
}

根据is:

happy number
是通过以下过程定义的数字:

从任何正整数开始,用数字的平方和替换该数字,并重复该过程,直到该数字等于1(它将保持不变),或在不包括1的循环中无限循环

这个过程以1结尾的数字是快乐数字,而不以1结尾的数字是不快乐数字(或悲伤数字)

例如:

例如,19是快乐的,因为关联的序列是:

1^2+9^2=82

8^2+2^2=68

6^2+8^2=100

1^2+0^2+0^2=1

代码:一些修改以获得满意的数字

 public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    System.out.println("Enter number: ");
    int n = sc.nextInt();

    int l = String.valueOf(n).length();
    int temp = n;

    int midVar = 0, addVar = 0, i = 0;

    while (temp != 4) {
        midVar = 0;

        while (temp != 0) {
            addVar = temp % 10;
            temp = temp / 10;
            midVar += Math.pow(addVar, 2);
        }
        temp = midVar;
        System.out.println(midVar);


        if (temp == 1) {
            break;
        }
    }

    if (temp == 1) {
        System.out.println("Happy number");
    } else {
        System.out.println("Unhappy number");
    }
}


我想你可能会得到编译时错误
temp/Math.pow(10,i)
。发布您的真实代码。
可能的精度损失错误
无法重现您给出的示例。@user3460322如果这是真实代码,那么您应该会出现编译错误\我想您可能会出现编译时错误
temp/Math.pow(10,i)
。发布您的真实代码。
可能的精度损失错误
无法重现您给出的示例。@user3460322如果这是真实代码,那么您应该得到一个编译错误\Rohit,您的解决方案是绝对正确的,但我的目标并不仅仅是解决我的问题。实际上,我更关心的是为什么我会得到不可能的输出。2.当我复制你的代码时。有1个编译错误,即转换为int。这里:addVar=temp/Math.pow(10,i);-它应该是addVar=(int)temp/Math.pow(10,i);考虑到你的输出-我猜是温度值-2(我不确定)。我担心您使用的IDE是什么,因为代码有编译错误,即使您运行,也会出现runtimeexception。我最近在Eclipse上遇到了一些问题,所以在我重新下载它的时候,我决定看看为什么Coding Ground如此受欢迎。这个程序是在编码区IDE中执行的。好吧,我无法在编码区运行它,但请看这里的ideone.com-。它给出了编译信息-Main.java:28:错误:不兼容的类型:从double到int addVar=temp/Math.pow(10,i)的可能有损转换;罗希特,你的解决方案是绝对正确的,但我的目标不仅仅是解决我的问题。实际上,我更关心的是为什么我会得到不可能的输出。2.当我复制你的代码时。有1个编译错误,即转换为int。这里:addVar=temp/Math.pow(10,i);-它应该是addVar=(int)temp/Math.pow(10,i);考虑到你的输出-我猜是温度值-2(我不确定)。我担心您使用的IDE是什么,因为代码有编译错误,即使您运行,也会出现runtimeexception。我最近在Eclipse上遇到了一些问题,所以在我重新下载它的时候,我决定看看为什么Coding Ground如此受欢迎。这个程序是在编码区IDE中执行的。好吧,我无法在编码区运行它,但请看这里的ideone.com-。它给出了编译信息-Main.java:28:错误:不兼容的类型:从double到int addVar=temp/Math.pow(10,i)的可能有损转换;