/**
* 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。 请帮助我,我做错了我的循环甚至不再提供输出,在此之前不会停止添加数字
答案 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个数字,但是您读取了预期的测试数量,在阅读了一行之后,您立即开始计算。
了解休息时间:
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 );