Java逻辑测试问题花式编号

时间:2017-11-08 10:48:07

标签: java arrays

1。看上数是序列1,1,在一个数字5,17,61,...

请注意,前两个花哨的数字是1,除了前两个数字之外的任何花哨的数字都是前一个的两倍和前一个的两倍之和。见下文:

  

1,1,

     

3 * 1 + 2 * 1 = 5

     

3 * 5 + 2 * 1 = 17

     

3 * 17 + 2 * 5 = 61

编写一个名为isFancy的函数,如果其整数参数是一个Fancy数,则返回1,否则返回0.该函数的签名是int isFancy(int n)

解决方案:

public class fancynumber {
public static void main(String[] args) {
    System.out.println(isFancy(5));
     System.out.println(isFancy(17));
      System.out.println(isFancy(61));
}

private static int isFancy(int i) {
    int previous = 1;
    int pprevious = 1;
    int set = 0;
    int currentvalue = 0;
    for(int a = 0; a<i;a++){

       currentvalue = 3*previous + 2*pprevious;

        if(currentvalue==i){
            set = 1;
            break;
        }
        else{
            set = 0;
        previous = currentvalue;
        pprevious = previous;
        }


    }
    return set;
}

}

这里有什么问题?我无法解决这个问题。在这里,根据条件,所有功能都应显示1,但只有第一个显示1,其他两个显示为0.为什么?

3 个答案:

答案 0 :(得分:8)

在将previous分配给pprevious之前,您将覆盖 previous = currentvalue; pprevious = previous; 的值。

更改

    pprevious = previous;
    previous = currentvalue;

spring-boot:run

答案 1 :(得分:1)

测试一下;它完美无缺:

private static int isFancy(int n) {
    if (n == 1)
        return 1;

    int fancyNumber = 0;
    int pprevious = 1;
    int previous = 1;

    while (fancyNumber < n) {
        fancyNumber = ((3 * previous) + (2 * pprevious));
        pprevious = previous;
        previous = fancyNumber;
    }

    if (fancyNumber == n)
        return 1;

    return 0;
}

问题是您没有正确更新限制。你总是乘以前一个。例如,在第二次执行中,您正在执行5*3 + 2*5

答案 2 :(得分:-1)

哦,我发现了自己的错误。我用原始代码替换它,并得到我的答案

pprevious = previous;
previous = currentvalue;