The Problém 3N+1 je abstraktný matematický problém, ktorý je domnienkou (zatiaľ nie je dokázaná). Je tiež známy ako Collatzov problém. V tejto časti budeme diskutovať o probléme 3N+1 spolu s jeho programom Java.
Úlohou je napísať Java program, ktorý prečíta kladné celé číslo od užívateľa a vytlačí ho 3N+1 postupnosť začínajúca od tohto celého čísla. Program by mal tiež spočítať a vytlačiť počet výrazov v poradí.
Nájdenie sekvencie 3N+1
Vzhľadom na kladné celé číslo, N, definujte postupnosť 3N+1 začínajúcu od N takto:
- Ak je N párne číslo, vydeľte N dvoma.
- Ak je N nepárne číslo, vynásobte N 3 a pridajte 1.
- Pokračujte vo vytváraní čísel týmto spôsobom, kým sa N nestane rovným 1.
Matematicky môžeme definovať problém 3N+1 takto:
Poďme pochopiť problémové vyhlásenie prostredníctvom príkladu.
Predpokladajme, N = 3 , čo je nepárne číslo. Podľa vyššie uvedeného pravidla, vynásobte N 3 a pridajte 1, dostaneme N = 3*3+1 = 10. Preto sa N stane párnym číslom. Teraz vydeľte N 2. Získame N = 10/2 = 5. Pokračujte v procese, kým sa N nebude rovnať 1. Preto bude sekvencia 3N+1 3, 10, 5, 16, 8, 4, 2, 1 .
Algoritmus problému 3N+1
Aby bolo možné vypočítať ďalší člen, program musí vykonať rôzne akcie v závislosti od toho, či N je dokonca alebo zvláštny . Pre to isté sme požadovali príkaz if, ktorý rozhodne, že N je párne alebo nepárne.
Jediným problémom, ktorý zostáva, je počítanie. Počítanie znamená, že začíname od nuly a vždy, keď máme čo počítať, pridáme 1. Na počítanie potrebujeme premennú (povedzme počítanie).
Musíme sa ešte obávať úplne prvého kroku. Ako môžeme od používateľa získať kladné celé číslo? Ak iba čítame číslo, je možné, že používateľ zadá záporné číslo alebo nulu. Ak budeme sledovať, čo sa stane, keď je hodnota N záporná alebo nulová, uvidíme, že program bude pokračovať navždy, pretože hodnota N sa nikdy nebude rovnať 1, čo nie je kompatibilné.
V tomto prípade problém pravdepodobne nie je veľký, ale vo všeobecnosti by sme sa mali snažiť písať programy, ktoré sú spoľahlivé. Jedným zo spôsobov, ako to vyriešiť, je pokračovať v čítaní čísel, kým používateľ nezadá kladné číslo.
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;
Prvá slučka while sa podľa potreby skončí iba vtedy, keď N je kladné číslo. Ak N nie je kladné, požiadajte používateľa, aby zadal inú hodnotu. Problém nastáva, ak je aj druhé číslo zadané používateľom nekladné. Príkaz if sa vykoná iba raz, takže druhé vstupné číslo sa nikdy netestuje.
Pomocou cyklu while po zadaní druhého čísla počítač preskočí späť na začiatok cyklu a otestuje, či je druhé číslo kladné. Ak nie, požiada používateľa o tretie číslo a bude žiadať čísla, kým používateľ nezadá prijateľný vstup.
Implementujme vyššie uvedený algoritmus v programe Java.
Problémový program Java 3n+1
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></=>