The Problem 3N+1 jest abstrakcyjnym problemem matematycznym będącym przypuszczeniem (jeszcze nie udowodnionym). Znany jest również jako Problem z Collatzem. W tej sekcji omówimy problem 3N+1 wraz z jego programem w Javie.
Zadanie polega na napisaniu programu w Javie, który odczyta od użytkownika dodatnią liczbę całkowitą i wyświetli wynik 3N+1 sekwencję rozpoczynającą się od tej liczby całkowitej. Program powinien także policzyć i wydrukować liczbę wyrazów w ciągu.
Znajdowanie ciągu 3N+1
Mając dodatnią liczbę całkowitą N, zdefiniuj sekwencję 3N+1 zaczynając od N w następujący sposób:
- Jeśli N jest liczbą parzystą, podziel N przez dwa.
- Jeśli N jest liczbą nieparzystą, pomnóż N przez 3 i dodaj 1.
- Kontynuuj generowanie liczb w ten sposób, aż N stanie się równe 1.
Matematycznie możemy zdefiniować problem 3N+1 w następujący sposób:
Rozumiemy sformułowanie problemu na przykładzie.
Przypuszczać, N = 3 , co jest liczbą nieparzystą. Zgodnie z powyższą zasadą mnożymy N przez 3 i dodajemy 1, otrzymujemy N = 3*3+1 = 10. Zatem N staje się liczbą parzystą. Teraz podziel N przez 2. Otrzymasz N = 10/2 = 5. Kontynuuj proces, aż N stanie się równe 1. Zatem sekwencja 3N+1 będzie równa 3, 10, 5, 16, 8, 4, 2, 1 .
Algorytm problemowy 3N+1
Aby obliczyć kolejny wyraz, program musi podjąć różne działania w zależności od tego, czy N Jest nawet Lub dziwne . W tym samym celu potrzebowaliśmy instrukcji if, która zadecyduje, że N jest parzyste lub nieparzyste.
Jedynym problemem, który pozostaje, jest liczenie. Liczenie oznacza, że zaczynamy od zera i za każdym razem, gdy mamy coś do policzenia, dodajemy 1. Potrzebujemy zmiennej (powiedzmy liczenie), aby wykonać liczenie.
Nadal musimy się martwić o pierwszy krok. Jak możemy uzyskać dodatnią liczbę całkowitą od użytkownika? Jeśli po prostu wczytamy liczbę, możliwe jest, że użytkownik wprowadzi liczbę ujemną lub zero. Jeśli prześledzimy, co się dzieje, gdy wartość N jest ujemna lub zerowa, zobaczymy, że program będzie trwał w nieskończoność, ponieważ wartość N nigdy nie stanie się równa 1, co nie jest zgodne.
W tym przypadku problem prawdopodobnie nie jest duży, ale ogólnie powinniśmy starać się pisać programy, które są niezawodne. Jednym ze sposobów rozwiązania tego problemu jest wczytywanie liczb, dopóki użytkownik nie wprowadzi liczby dodatniej.
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;
Pierwsza pętla while zakończy się tylko wtedy, gdy N będzie liczbą dodatnią, zgodnie z wymaganiami. Jeśli N nie jest dodatnie, poproś użytkownika o wprowadzenie innej wartości. Problem pojawia się, jeśli druga liczba wprowadzona przez użytkownika również nie jest dodatnia. Instrukcja if jest wykonywana tylko raz, więc drugi numer wejściowy nigdy nie jest testowany.
W przypadku pętli while, po wprowadzeniu drugiej liczby, komputer przeskakuje z powrotem na początek pętli i sprawdza, czy druga liczba jest dodatnia. Jeśli nie, prosi użytkownika o trzeci numer i będzie pytać o liczby, dopóki użytkownik nie wprowadzi akceptowalnych danych.
Zaimplementujmy powyższy algorytm w programie Java.
3n+1 Problem z programem 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></=>