פורסם 2004 בינואר 921 שנים איך אני יכול ליעל את הקוד הבא:program find_ny_naturals;function IsEqualSums(m,n:longint):boolean;begin IsEqualSums:=((((1+m-1)*(m-1)) div 2)=(((m+1+n)*(n-m) div 2)));end;procedure FindPairs;var i,j,n:longint; flag:boolean;begin n:=1; for j:=n to maxlongint do for i:=n to j do if IsEqualSums(i,j) then begin n:=2*(j+i); writeln(i,' ',j); end;end;begin FindPairs; readln;end.התוכנית עובדת אבל מאוד איטי אחרי שהיא מוצאת את ה 6 זוגות הראשונים של המספרים היא חושבת המון המון המון זמן.אני מנסה לעלות על החוקיות (אם יש בכלל) ולא מצליח למצוא פיתרון יעיל יותר.עד כמה שידוע לי אמורות ליהיות לתוכנית 7 דרכים שונות לכתוב את התוכנית כך שהיא תמצא לי את המספרים.הודה לעזרתכם הנדיבה בנידון.
פורסם 2004 בינואר 921 שנים מחבר אין לי כוח לנסות להבין מה היא עושה אם תסביר מה היא עושה אני אנסה לעזור לך היא מוצאת כל זוגות המספרים השלמים (m,n) אשר מקיימים את התנאי שסכום האיברים מ 1 עד ל m-1 שווה לסכום האיברים מ m+1 עד n כפי שניתן לראות מדובר בחישוב סכום סדרות חשבוניות לצורך בדיקת קיום התנאי לזוג מספרים מתבקש. התוכנית מוצאת איזה 12 זוגות מספרים כאלו כדוגמא: 1,1 6,8 35,49 204,288 1189,1681וכ"ד. כרגע התוכנית עושה זאת בצורה לא יעילה ולוקח לה שעות למצוא את כל המספרים את שישה שבעה זוגות ראשונים היא מוצאת מהר אפשר לומר את השישה הראשונים די מהר אבל אחר כך.... ;D נ.ב. עם מישהו רוצה לבדוק עד כמה מהיר המחשב שלו או שמע לבדוק עם ה OC שלו יציב אז אני מציע לו לנסות להריץ תוכנית כזאת ולראות את התוצאות.
פורסם 2004 בינואר 1021 שנים (1+m-1)(m-1)div 2בשביל מה להוסיף ולחסר אחד ?גם אין צורך לחלק ב 2, כל עוד כל הזמן לא תחלק בשניים (אם הסכומים שווים אז גם פעמיים הסכומים שווים)האלגוריתם עצמו די כבד. עדיף לעבור מספר מספר ולחשב את הסכום של המספרים מ 1 עד M-1עכשיו תיקח את הנוסחא לחישוב הסכום של המספרים בין M+1 עד N:(m+n+1)(n-m) - השמטתי שוב את החילוק ב 2 כאמורובא נהפוך את הנוסחא:(m+n+1)(n-m)=SUM(m)mn-m2+n2-mn+n-m=SUM(m)n2+n-(m2+m+SUM(m))n=[-1+sqrt(1+4(m2+m+SUM(m))]/2אם זה יוצא מספר שלם סימן שיש לך פיתרון ומצאת את הזוג של m, אחרת אין ל m זוג ואתה מתקדם לבדוק את m+1.
פורסם 2004 בינואר 1021 שנים אני לא מבין למה לא השתמשת בנוסחאות של סכום סידרה על מנת לפשט את כל הדרך.. לקח קצת זמן להיזכר בחומר של התיכון, אבל בסוף הגעתי למשוואה די פשוטה (לאחר עבודת פישוט קלה..) , שאם היא מתקיימת אז יש לך זוג מספרים מהסוג שאתה מחפש: 0=n^2 - 2m^2 +n או אם יותר נוח לך לראות את זה ככה: n(n+1) = 2m^2 כל שעליך לעשות הוא ליישם את הנוסחא בפסקל ולמצוא פתרונות שמקיימים את המשוואה, כל M ו N שיקיימו את המשוואה הם זוג מספרים שעונה על התנאים שלך. נ.ב. יכול להיות שלזה התכוון אמירם למרות שלא כל כך הצלחתי לעקוב אחריו, (השעה כבר די מאוחרת ואני קם ממש מוקדם מחר אז אולי מאוחר יותר אני אציץ בה שוב..) לילה טוב...
פורסם 2004 בינואר 1021 שנים זה באמת יותר פשוט, אבל זה לא טריויאלי למצוא לזה פתרונות.השלב הבא בפיתוח הנוסחא הוא בידוד של mm=sqrt(n(n+1)/2)עכשיו צריך לעבור על ה n אחד אחד ולמצוא מקרים שבהם התוצאה יוצאת שלמה.מבחינת סיבוכיות זה אותו הדבר כמו הפיתרון שלי, רק הרבה יותר פשוט להבנה.רק לצורך הדגמה:m=sqrt(8(8+1)/2)m=6וקיבלנו את הצמד 6,8m=sqrt(288(288+1)/2)m=204וקיבלנו 204,288
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.