Java 确定数字是否为';平淡';

Java 确定数字是否为';平淡';,java,compiler-errors,Java,Compiler Errors,所以我一直在写一个程序,确定一个数字是否平淡。也就是说,如果你选择了一个数字: 例如,你加上每个数字的平方,5*5+7*7,这就是新的数字:74。你一直这样做,直到你得到58,这意味着这个数字不是平淡的,或者你得到1,这意味着这个数字是平淡的。58只会重复一个始终以58结尾的序列 所以我想尝试一些基本的递归,但也许我误解了递归的用法 以下是我写的两个相关方法: public static boolean insipid(int num){ int dig1 = 0, dig2 = 0,

所以我一直在写一个程序,确定一个数字是否平淡。也就是说,如果你选择了一个数字: 例如,你加上每个数字的平方,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);
}
publicstaticbooleansipid(int-num){
int dig1=0,dig2=0,dig3=0;//num=159例如,dig1将是1。如果是两位数,则默认为0,dig1*dig1=0
如果(num==58){//,则该数字并非平淡无奇
返回false;
}
如果(num==1){//,则该数字是平淡的
返回true;
}
如果(数值<10){
平淡(num*num);
}
如果(数值>99){
dig1=(int)(num/100);
dig2=(int)((num-100)/10);
dig3=num-((int)(num/10))*10;
平淡(平方和(dig1,dig2,dig3));
}
否则{
dig2=(int)(num/10);//10的位置
dig3=num-((int)(num/10))*10);//1的位置
平淡(平方和(dig1,dig2,dig3));//dig1=0,所以我只是将它一起传递。
}
}
公共静态整数平方和(整数dig1,整数dig2,整数dig3){
//返回三位数的平方和。
返回(dig1*dig1)+(dig2*dig2)+(dig3+dig3);
}
它给了我一个错误,即每当我提供一个数字时,Insipid()必须返回一个布尔值。但我知道,对于给定的任何数字,它最终都会解析为58或1。那么,真或假不应该总是最终返回,所以返回一个布尔值,错误是无效的吗?显然情况并非如此,但我如何看待它。这里使用的递归是无效的吗


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

如下更新您的平淡。使用
return声明的方法在所有情况下都必须返回值。如果您的方法到达second-else,即如果数字不是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 ;
}
publicstaticbooleansipid(int-num){
布尔返回值=false;
如果(num==58){//,则该数字并非平淡无奇
//无所事事
}如果(num==1){//,则该数字是平淡的
returnValue=true;
}否则{
int dig1=0,dig2=0,dig3=0;//num=159例如,dig1将是1。如果是两位数,则默认为0,dig1*dig1=0
如果(数值<10){
returnValue=平淡(num*num);
}
如果(数量>99),则为else{
dig1=(int)(num/100);
dig2=(int)((num-100)/10);
dig3=num-((int)(num/10))*10;
returnValue=平淡(平方和(dig1,dig2,dig3));
}
否则{
dig2=(int)(num/10);//10的位置
dig3=num-((int)(num/10))*10);//第一位
returnValue=insipid(平方和(dig1,dig2,dig3));//dig1=0,所以我把它和它一起传递。
}
}
返回值;
}

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

如下更新您的信息。使用
return声明的方法在所有情况下都必须返回值。如果您的方法到达second-else,即如果数字不是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 ;
}
publicstaticbooleansipid(int-num){
布尔返回值=false;
如果(num==58){//,则该数字并非平淡无奇
//无所事事
}如果(num==1){//,则该数字是平淡的
returnValue=true;
}否则{
int dig1=0,dig2=0,dig3=0;//num=159例如,dig1将是1。如果是两位数,则默认为0,dig1*dig1=0
如果(数值<10){
returnValue=平淡(num*num);
}
如果(数量>99),则为else{
dig1=(int)(num/100);
dig2=(int)((num-100)/10);
dig3=num-((int)(num/10))*10;
returnValue=平淡(平方和(dig1,dig2,dig3));
}
否则{
dig2=(int)(num/10);//10的位置
dig3=num-((int)(num/10))*10);//第一位
returnValue=insipid(平方和(dig1,dig2,dig3));//dig1=0,所以我把它和它一起传递。
}
}
返回值;
}

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

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

的递归调用的返回语句。除了Yogendra Singh的答案之外,您还错误地计算了数字:例如

dig2 = (int)((num -100)/10);
假设百位数是1。试一试

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

同样地,对于
dig3

来说,除了Yogendra Singh的答案之外,您计算数字的方法也不正确:例如,使用

dig2 = (int)((num -100)/10);
假设百位数是1。试一试

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

同样地,对于
dig3

在提出新问题之前,请接受您之前问题的正确答案。首先,您不会在平淡的问题上返回任何东西。也许一个
返回平淡(…)
应该可以消除编译时错误;确保您的算法不会适用于任何大于199的数字。在提出新问题之前,请接受您以前问题的正确答案。首先,您不会返回任何平淡的其他问题。也许一个
返回平淡(…)
应该可以消除编译时错误;确保您的算法不适用于任何大于199的数字。下面给出了获取任何数字位数的一个非常好的方法