The 3N+1 problema yra abstrakti matematinė problema, kuri yra spėjimas (dar neįrodyta). Jis taip pat žinomas kaip Collatz problema. Šiame skyriuje aptarsime 3N+1 problemą kartu su „Java“ programa.
Užduotis yra parašyti Java programą, kuri nuskaitys teigiamą sveikąjį skaičių iš vartotojo ir išspausdins 3N+1 seka, prasidedanti nuo to sveikojo skaičiaus. Programa taip pat turėtų suskaičiuoti ir atspausdinti terminų skaičių sekoje.
3N+1 sekos radimas
Jei teigiamas sveikasis skaičius N, apibrėžkite 3N+1 seką, pradedant nuo N taip:
- Jei N yra lyginis skaičius, tada N padalinkite iš dviejų.
- Jei N yra nelyginis skaičius, padauginkite N iš 3 ir pridėkite 1.
- Toliau generuokite skaičius tokiu būdu, kol N taps lygus 1.
Matematiškai 3N+1 uždavinį galime apibrėžti taip:
Supraskime problemos teiginį per pavyzdį.
formato eilutė java
Tarkime, N = 3 , kuris yra nelyginis skaičius. Pagal aukščiau pateiktą taisyklę, padauginus N iš 3 ir pridėjus 1, gauname N = 3*3+1 = 10. Todėl N tampa lyginiu skaičiumi. Dabar padalykite N iš 2. Gaunate N = 10/2 = 5. Tęskite procesą, kol N taps lygus 1. Taigi seka 3N+1 bus 3, 10, 5, 16, 8, 4, 2, 1 .
3N+1 uždavinio algoritmas
Kad būtų galima apskaičiuoti kitą terminą, programa turi atlikti skirtingus veiksmus, priklausomai nuo to, ar N yra net arba nelyginis . Tam reikėjo teiginio if, kuris nuspręs, kad N yra lyginis arba nelyginis.
Viena problema, kuri išlieka, yra skaičiavimas. Skaičiavimas reiškia, kad pradedame nuo nulio ir kiekvieną kartą, kai turime ką skaičiuoti, pridedame 1. Skaičiavimui reikia kintamojo (tarkim, skaičiavimo).
Vis dar turime nerimauti dėl paties pirmojo žingsnio. Kaip galime gauti teigiamą sveikąjį skaičių iš vartotojo? Jei tik perskaitysime skaičių, gali būti, kad vartotojas gali įvesti neigiamą skaičių arba nulį. Jei stebėsime, kas atsitinka, kai N reikšmė yra neigiama arba nulis, pamatysime, kad programa tęsis amžinai, nes N reikšmė niekada netaps lygi 1, o tai nesuderinama.
Šiuo atveju problema tikriausiai nėra didelė, bet apskritai turėtume stengtis rašyti programas, kurios būtų patikimos. Vienas iš būdų tai išspręsti – skaityti skaičius, kol vartotojas įveda teigiamą skaičių.
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;
Pirmoji while kilpa baigsis tik tada, kai N yra teigiamas skaičius, kaip reikia. Jei N nėra teigiamas, paprašykite vartotojo įvesti kitą reikšmę. Problema kyla, jei vartotojo įvestas antrasis skaičius taip pat nėra teigiamas. Jei sakinys vykdomas tik vieną kartą, todėl antrasis įvesties numeris niekada nėra tikrinamas.
objektų lygybė java
Su while ciklu, įvedus antrąjį skaičių, kompiuteris grįžta atgal į ciklo pradžią ir patikrina, ar antrasis skaičius yra teigiamas. Jei ne, jis paprašys vartotojo trečiojo numerio ir toliau prašys skaičių, kol vartotojas įves priimtiną įvestį.
Įdiegkime minėtą algoritmą Java programoje.
3n+1 Probleminė Java programa
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></=>