עבור לתוכן

שאלה בפסקל/מתמטיקה

Featured Replies

פורסם

איך אני יכול ליעל את הקוד הבא:

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 דרכים שונות לכתוב את התוכנית כך שהיא תמצא לי את המספרים.

הודה לעזרתכם הנדיבה בנידון.

פורסם

אין לי כוח לנסות להבין מה היא עושה

אם תסביר מה היא עושה אני אנסה לעזור לך

פורסם
  • מחבר

אין לי כוח לנסות להבין מה היא עושה

אם תסביר מה היא עושה אני אנסה לעזור לך

היא מוצאת כל זוגות המספרים השלמים (m,n) אשר מקיימים את התנאי שסכום האיברים מ 1 עד ל m-1 שווה לסכום האיברים מ m+1 עד n

כפי שניתן לראות מדובר בחישוב סכום סדרות חשבוניות לצורך בדיקת קיום התנאי לזוג מספרים מתבקש.

התוכנית מוצאת איזה 12 זוגות מספרים כאלו כדוגמא:

1,1

6,8

35,49

204,288

1189,1681וכ"ד.

כרגע התוכנית עושה זאת בצורה לא יעילה ולוקח לה שעות למצוא את כל המספרים את שישה שבעה זוגות ראשונים היא מוצאת מהר אפשר לומר את השישה הראשונים די מהר אבל אחר כך....

;D ;)נ.ב. עם מישהו רוצה לבדוק עד כמה מהיר המחשב שלו או שמע לבדוק עם ה OC שלו יציב אז אני מציע לו לנסות להריץ תוכנית כזאת ולראות את התוצאות.

פורסם

(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.

פורסם

אני לא מבין למה לא השתמשת בנוסחאות של סכום סידרה על מנת לפשט את כל הדרך..

לקח קצת זמן להיזכר בחומר של התיכון, אבל בסוף הגעתי למשוואה די פשוטה (לאחר עבודת פישוט קלה..) , שאם היא מתקיימת אז יש לך זוג מספרים מהסוג שאתה מחפש:

0=n^2 - 2m^2 +n

או אם יותר נוח לך לראות את זה ככה:

n(n+1) = 2m^2

כל שעליך לעשות הוא ליישם את הנוסחא בפסקל ולמצוא פתרונות שמקיימים את המשוואה, כל M ו N שיקיימו את המשוואה הם זוג מספרים שעונה על התנאים שלך.

נ.ב. יכול להיות שלזה התכוון אמירם למרות שלא כל כך הצלחתי לעקוב אחריו, (השעה כבר די מאוחרת ואני קם ממש מוקדם מחר ;) אז אולי מאוחר יותר אני אציץ בה שוב..)

לילה טוב...

פורסם

זה באמת יותר פשוט, אבל זה לא טריויאלי למצוא לזה פתרונות.

השלב הבא בפיתוח הנוסחא הוא בידוד של m

m=sqrt(n(n+1)/2)

עכשיו צריך לעבור על ה n אחד אחד ולמצוא מקרים שבהם התוצאה יוצאת שלמה.

מבחינת סיבוכיות זה אותו הדבר כמו הפיתרון שלי, רק הרבה יותר פשוט להבנה.

רק לצורך הדגמה:

m=sqrt(8(8+1)/2)

m=6

וקיבלנו את הצמד 6,8

m=sqrt(288(288+1)/2)

m=204

וקיבלנו 204,288

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים