我想弄清楚Collat​​zSequence

时间:2016-10-17 21:08:22

标签: java collatz

/**
 * Created by abdul on 10/17/2016.
*/
import java.util.Scanner;
public class CollatzSequence {
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Enter Cases: ");
    int cases = in.nextInt();
    int count = 0;
    for (int i = 0; i <= cases; i++) {
        int a = in.nextInt();
        do {
            if (a % 2 == 1) {
                count++;
                break;
            } else if (a % 2 == 0){
                a = a / 2;
                a = a;
                count++;
            } else {
                a = 3 * (a + 1);
                a = a;
                count++;
            }
        }while (a != 1) ;
    } System.out.println(count);
  }
}

这不是作业,而是来自代码修道院http://www.codeabbey.com/index/task_view/collatz-sequence X是初始数字 例如,如果X是偶数(即X模2 = 0)那么     Xnext = X / 2 其他     Xnext = 3 * X + 1 当x = 15时序列需要17次才能达到1。 请帮助我,我做错了我的循环甚至不再提供输出,在此之前不会停止添加数字

2 个答案:

答案 0 :(得分:0)

您有一个a%2==1条件和一个a%2==0条件,然后是这两个条件都不成立的条件。所以你有一个偶数的条件,一个奇数的条件,一个数字的条件,既不是偶数也不是奇数。由于没有既不是偶数也不是奇数的数字,这没有任何意义。

尝试:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Enter Cases: ");
    int cases = in.nextInt();

    for (int i = 0; i <= cases; i++) {
        int count = 0;
        int a = in.nextInt();
        do {
            if (a % 2 == 1) {
                a = (3 * a) + 1;
                count++;
            } else if (a % 2 == 0){
                a = a / 2;
                count++;
            }
        } while (a != 1);
        System.out.println(count);
    }
}

我还删除了a=a语句,因为它们没有做任何事情。

答案 1 :(得分:0)

您的第一个错误是,您没有阅读3个数字,但是您读取了预期的测试数量,在阅读了一行之后,您立即开始计算。

  1. 将计算与输入收集分开。
  2. 将计算移动到它自己的类中,因此您可以将它分开。
  3. 了解休息时间:

    break内的代码if,不会退出if,它会在第一个奇数结果上退出do ... while。因此,输入17将立即读取下一个整数。

    nohouser9已经给你一个正确的工作样本,所以我会留下它。

    更新:不,我不是: - )

    计数将在for - 循环后的当前代码中输出,因此您只能看到计算的最后结果。 do ... while完成后,您将读取下一个整数。由于您的代码在do之后未输出任何结果,因此它看起来已冻结(对于cases&gt; 1)。

    最后:你在计算错误。序列是

    3 * x + 1 
    

    为奇数。但是你使用的是公式:

    3 * ( x + 1 )
    

    还有一个:您运行的数字太多了:在for循环中,您从0 ... cases开始运行cases + 1循环。您需要在for循环中修复i < cases

    我重写了你的代码:

    public class CollatzMain {
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            System.out.println("Enter Cases: ");
            int cases = in.nextInt();
    
            for (int i = 1; i <= cases; i++) {
                System.out.printf("Enter Sample (%d): ", i);
                int a = in.nextInt();
                int count = collatzSequenceLength(a);
                System.out.printf("Input %d -> %d steps to 1.%n", a, count);
            }
        }
    
        private static int collatzSequenceLength(int a) {
            int count = 0;
    
            do {
                count++;
                // alternative to if:
                // a = ((a % 2) == 0) ? (a >> 1) : (a * 3) + 1
    
                if ((a % 2) == 0) {
                    a = (a >> 1); // since we do integer math, we can shift bits to divide by 2. a = a/2 is fine, though...
                }
                else {
                    a = a * 3 + 1;
                }
            }
            while(a!=1);
    
            return count;
        }
    }
    

    为了好玩,序列的代码可以用无体for循环编写。虽然风格不好,但很有趣: - )

    for(count = 0; a!=1; count++, a = ((a % 2) == 0) ? (a >> 1) : (a * 3) + 1 );