ה בעיה 3N+1 היא בעיה מתמטית מופשטת שהיא השערה (עדיין לא הוכחה). זה ידוע גם בשם בעיית קולאץ. בסעיף זה, נדון בבעיית 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
על מנת לחשב את המונח הבא, על התוכנית לבצע פעולות שונות בהתאם לשאלה אם נ הוא אֲפִילוּ אוֹ מוזר . לשם כך, דרשנו הצהרת אם שתחליט ש-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></=>