- הגשות
- פתרונות
- פתרון רשמי
- תיאור
הגדרה:
נאמר שהמספר השלם a
מחלק את המספר השלם b
, אם כשמחלקים את b
ב-a
אין שארית. כלומר, \(b\%a==0\). (לדוגמא, 3 מחלק את 12, 7 מחלק את 21 וכד').
כאשר אחד מהמספרים (או שניהם) שליליים, אנחנו אומרים ש-a
הוא מחלק של b
אם הערך המוחלט של a
הוא מחלק של הערך המוחלט של b
. (לדוגמא, המספר 4- מחלק את 20, וגם את 20-, וכן 5 מחלק את 15- וגם את 15).
משימה:
כתבו שיטה סטטית יעילה שמקבלת כפרמטר מערך חד-ממדי arr
המכיל מספרים שלמים חיוביים ושליליים (ללא אפסים).
- השיטה צריכה לבדוק אם אחד מהערכים במערך מחלק את כל שאר הערכים במערך.
- אם כן, השיטה צריכה להחזיר את הערך הזה.
- אם לא, השיטה תחזיר 1-.
- אם יש יותר מערך אחד כזה במערך, השיטה תחזיר את הראשון מהם במערך.
- שימו לב: למרות ש-1 ו-1- מחלקים את כל המספרים, אנחנו לא מתייחסים אליהם כאל מחלקים.
דוגמאות:
- אם המערך הוא
[25, -20, 5, 10, 100, 60]
, השיטה צריכה להחזיר את הערך 5 כי הוא מחלק את כל שאר האיברים במערך. - אם המערך הוא
[25, -20, 5, 3, 30, -10, -100]
, השיטה צריכה להחזיר את הערך 1- כי אין במערך אף איבר שמחלק את כל שאר האיברים שבמערך.
חתימת השיטה היא:
public static int findDivisor (int [] arr)
שימו לב:
- השיטה שתכתבו צריכה להיות יעילה ככל הניתן, גם מבחינת סיבוכיות הזמן וגם מבחינת סיבוכיות המקום.
- תשובה שאינה יעילה מספיק, כלומר, שתהיה בסיבוכיות גדולה יותר מזו הנדרשת לפתרון הבעיה, תקבל מעט נקודות בלבד.
- ציינו מהי סיבוכיות זמן הריצה ומהי סיבוכיות המקום של השיטה שכתבתם. הסבירו תשובתכם. אל תשכחו לתעד את מה שכתבתם!
במקום לבדוק כל איבר במערך מול כל שאר האיברים (פתרון שעובד אך אינו יעיל מספיק), נסו לחשוב על תכונה מתמטית מיוחדת שחייבת לאפיין את המספר המחלק.
שאלו את עצמכם:
- אם המספר
a
מחלק את המספרb
, מה ניתן לומר על הקשר בין הערך המוחלט שלa
לערך המוחלט שלb
? - כיצד תכונה זו יכולה לעזור לכם לצמצם באופן משמעותי את מספר ה"מועמדים" הפוטנציאליים לתשובה מתוך המערך?