그만큼 3N+1 문제 추측인(아직 입증되지 않은) 추상적인 수학 문제입니다. 그것은 또한로 알려져 있습니다 콜라츠 문제. 이 섹션에서는 Java 프로그램과 함께 3N+1 문제를 논의합니다.
작업은 사용자로부터 양의 정수를 읽고 이를 인쇄하는 Java 프로그램을 작성하는 것입니다. 3N+1 해당 정수부터 시작하는 시퀀스입니다. 프로그램은 또한 시퀀스의 용어 수를 계산하고 인쇄해야 합니다.
3N+1 수열 찾기
양의 정수 N이 주어지면 N에서 시작하는 3N+1 시퀀스를 다음과 같이 정의합니다.
- N이 짝수이면 N을 2로 나눕니다.
- N이 홀수이면 N에 3을 곱하고 1을 더합니다.
- N이 1이 될 때까지 이런 방식으로 계속 숫자를 생성합니다.
수학적으로 3N+1 문제는 다음과 같이 정의할 수 있습니다.
이진 트리 중위 순회
예를 통해 문제 설명을 이해해 봅시다.
가정하다, N = 3 , 이는 홀수입니다. 위의 규칙에 따라 N에 3을 곱하고 1을 더하면 N = 3*3+1 = 10이 됩니다. 따라서 N은 짝수가 됩니다. 이제 N을 2로 나눕니다. 이는 N = 10/2 = 5가 됩니다. N이 1이 될 때까지 과정을 계속합니다. 따라서 3N+1 수열은 다음과 같습니다. 3, 10, 5, 16, 8, 4, 2, 1 .
3N+1 문제 알고리즘
다음 항을 계산하기 위해 프로그램은 다음 항에 따라 다른 조치를 취해야 합니다. N ~이다 심지어 또는 이상한 . 마찬가지로 N이 짝수인지 홀수인지 판단하는 if 문이 필요했습니다.
남은 한 가지 문제는 계산입니다. 셈한다는 것은 0부터 시작하고, 계산할 것이 있을 때마다 1을 더한다는 것을 의미합니다. 계산을 수행하려면 변수(예: 계산)가 필요합니다.
우리는 여전히 첫 번째 단계에 대해 걱정해야 합니다. 사용자로부터 양의 정수를 어떻게 얻을 수 있나요? 숫자를 읽는 경우 사용자가 음수나 0을 입력할 수도 있습니다. N의 값이 음수이거나 0일 때 어떤 일이 일어나는지 따라가면 N의 값이 호환되지 않는 1과 결코 같지 않기 때문에 프로그램이 영원히 계속되는 것을 볼 수 있습니다.
나무를 펴다
이 경우 문제는 아마도 큰 문제가 아닐 것입니다. 그러나 일반적으로 우리는 완벽한 프로그램을 작성하도록 노력해야 합니다. 이 문제를 해결하는 한 가지 방법은 사용자가 양수를 입력할 때까지 숫자를 계속 읽는 것입니다.
Read a Positive integer N from the user while N is not positive: Print an error message; Read another value for N; Let count = 0; while N is not 1: if N is even: Compute N = N/2; else Compute N = 3 * N + 1; Output N; Add 1 to count; Output the count;
첫 번째 while 루프는 필요에 따라 N이 양수인 경우에만 종료됩니다. N이 양수가 아닌 경우 사용자에게 다른 값을 입력하도록 요청합니다. 사용자가 입력한 두 번째 숫자도 양수가 아닌 경우 문제가 발생합니다. if 문은 한 번만 실행되므로 두 번째 입력 숫자는 테스트되지 않습니다.
while 루프를 사용하면 두 번째 숫자가 입력된 후 컴퓨터가 루프의 시작 부분으로 돌아가서 두 번째 숫자가 양수인지 테스트합니다. 그렇지 않은 경우 사용자에게 세 번째 숫자를 묻고 사용자가 허용 가능한 입력을 입력할 때까지 계속해서 숫자를 묻습니다.
위의 알고리즘을 Java 프로그램에서 구현해 보겠습니다.
3n+1 문제 Java 프로그램
ThreeNPlusOneProblem.java
import java.util.Scanner; public class ThreeNPlusOneProblem { public static void main(String args[]) { //variable that denotes the starting point of the sequence int N; //variable to count the number of terms int count; Scanner sc=new Scanner(System.in); System.out.print('Enter the starting point for the sequence: '); //reads an integer from the user N=sc.nextInt(); while (N <= 0 1 2="=" 0) { system.out.println('the starting point must be positive. please re-enter the number: '); n="sc.nextInt();" } count="0;" executes when is greater than while (n !="1)" if % 2; an odd number else * + 1; system.out.print(n ' '); increments variable by system.out.println(); system.out.println('there are '+count+' terms in sequence.'); end of main() class < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/java-tutorial/27/3n-1-problem-java-2.webp" alt="3N+1 Problem in Java"> <hr></=>