logo

Java'da 3N+1 Sorunu

3N+1 problemi bir varsayım olan (henüz kanıtlanmamış) soyut bir matematik problemidir. Aynı zamanda şu şekilde de bilinir: Collatz sorunu. Bu bölümde 3N+1 problemini Java programıyla birlikte tartışacağız.

Görev, kullanıcıdan pozitif bir tam sayıyı okuyacak ve bu sayıyı yazdıracak bir Java programı yazmaktır. 3N+1 bu tamsayıdan başlayan dizi. Program ayrıca dizideki terimlerin sayısını saymalı ve yazdırmalıdır.

3N+1 Dizisini Bulma

Pozitif bir N tamsayısı verildiğinde, N'den başlayarak 3N+1 dizisini aşağıdaki gibi tanımlayın:

  • N çift sayı ise N'yi ikiye bölün.
  • N tek sayı ise N'yi 3 ile çarpın ve 1 ekleyin.
  • N, 1'e eşit oluncaya kadar bu şekilde sayı üretmeye devam edin.

Matematiksel olarak 3N+1 problemini şu şekilde tanımlayabiliriz:

Java'da 3N+1 Sorunu

Sorun ifadesini bir örnek üzerinden anlayalım.

Sanmak, N = 3 , bu tek bir sayıdır. Yukarıdaki kurala göre N'yi 3 ile çarpıp 1 eklediğimizde N = 3*3+1 = 10 elde ederiz. Dolayısıyla N çift sayı olur. Şimdi N'yi 2'ye bölelim. N = 10/2 = 5 olur. N, 1'e eşit olana kadar işleme devam edelim. Dolayısıyla 3N+1 dizisi şu şekilde olacaktır: 3, 10, 5, 16, 8, 4, 2, 1 .

3N+1 Problem Algoritması

Bir sonraki terimi hesaplamak için programın olup olmamasına bağlı olarak farklı eylemler yapması gerekir. N dır-dir eşit veya garip . Aynı şekilde, N'nin çift mi yoksa tek mi olduğuna karar verecek bir if ifadesine ihtiyacımız vardı.

Geriye kalan tek sorun sayımdır. Sayma, sıfırdan başlamamız anlamına gelir ve sayılacak bir şeyimiz olduğunda, 1 ekleriz. Saymayı yapmak için bir değişkene (örneğin sayma) ihtiyacımız vardır.

Hala ilk adım konusunda endişelenmemiz gerekiyor. Kullanıcıdan pozitif bir tamsayıyı nasıl alabiliriz? Sadece bir sayı okursak kullanıcının negatif bir sayı veya sıfır yazması mümkündür. N'nin değeri negatif ya da sıfır olduğunda ne olduğunu takip edersek programın sonsuza kadar devam edeceğini görürüz, çünkü N'nin değeri hiçbir zaman 1'e eşit olmaz ki bu da uyumlu değildir.

Bu durumda sorun muhtemelen çok önemli değildir, ancak genel olarak hatasız programlar yazmaya çalışmalıyız. Bunu düzeltmenin bir yolu, kullanıcı pozitif bir sayı girene kadar sayıları okumaya devam etmektir.

 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; 

İlk while döngüsü, gerektiği gibi yalnızca N pozitif bir sayı olduğunda sona erecektir. N pozitif değilse kullanıcıdan başka bir değer girmesini isteyin. Kullanıcı tarafından girilen ikinci sayının da pozitif olmaması durumunda sorun ortaya çıkar. If ifadesi yalnızca bir kez yürütülür, dolayısıyla ikinci giriş numarası hiçbir zaman test edilmez.

While döngüsünde ikinci sayı girildikten sonra bilgisayar döngünün başına döner ve ikinci sayının pozitif olup olmadığını test eder. Değilse, kullanıcıdan üçüncü bir sayı ister ve kullanıcı kabul edilebilir bir giriş girene kadar sayıları sormaya devam eder.

Yukarıdaki algoritmayı bir Java programında uygulayalım.

3n+1 Sorunlu Java Programı

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></=>