The 3N+1 проблем е абстрактен математически проблем, който е предположение (все още не е доказано). Известен е още като Проблем на Collatz. В този раздел ще обсъдим проблема 3N+1 заедно с неговата Java програма.
Задачата е да напишете Java програма, която ще прочете положително цяло число от потребителя и ще го отпечата 3N+1 последователност, започваща от това цяло число. Програмата също трябва да преброи и отпечата броя на термините в последователността.
Намиране на последователността 3N+1
Дадено е положително цяло число, N, дефинирайте последователността 3N+1, започвайки от N, както следва:
- Ако N е четно число, тогава разделете N на две.
- Ако 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
За да изчисли следващия член, програмата трябва да предприеме различни действия в зависимост от това дали н е дори или странно . За същото се нуждаехме от оператор 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('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></=>