logo

Проблема 3N+1 в Java

The 3N+1 завдання це абстрактна математична проблема, яка є гіпотезою (ще не доведеною). Він також відомий як Проблема Коллатца. У цьому розділі ми обговоримо проблему 3N+1 разом із її програмою Java.

Завдання полягає в тому, щоб написати програму на Java, яка читатиме позитивне ціле число від користувача та друкуватиме його 3N+1 послідовність, починаючи з цього цілого числа. Програма також повинна підрахувати та вивести кількість термінів у послідовності.

Знаходження послідовності 3N+1

Дано додатне ціле число N, визначте послідовність 3N+1, починаючи з N, таким чином:

  • Якщо N парне число, поділіть N на два.
  • Якщо N непарне число, то помножте N на 3 і додайте 1.
  • Продовжуйте генерувати числа таким чином, доки N не стане рівним 1.

Математично ми можемо визначити проблему 3N+1 так:

Проблема 3N+1 в Java

Зрозуміємо постановку задачі на прикладі.

Припустимо, 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

Щоб обчислити наступний член, програма повинна виконати різні дії залежно від того, чи є Н є навіть або непарний . Для того ж нам потрібен оператор if, який вирішить, чи N парне чи непарне.

Єдина проблема, яка залишається, це підрахунок. Підрахунок означає, що ми починаємо з нуля, і щоразу, коли у нас є щось для підрахунку, ми додаємо 1. Для підрахунку нам потрібна змінна (скажімо, підрахунок).

Нам ще потрібно потурбуватися про перший крок. Як ми можемо отримати додатне ціле число від користувача? Якщо ми просто прочитаємо число, цілком можливо, що користувач може ввести від’ємне число або нуль. Якщо ми прослідкуємо, що відбувається, коли значення N від’ємне або дорівнює нулю, ми побачимо, що програма триватиме вічно, оскільки значення 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(&apos;Enter the starting point for the sequence: &apos;); //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></=>