- הגשות
- פתרונות
- פתרון רשמי
- תיאור
כל מספר טבעי (שלם חיובי) \(num\) ניתן להציג כסכום של חזקות של מספר טבעי \(factor\) כלשהו, כאשר כל חזקה מופיעה פעם אחת לכל היותר.
דוגמאות:
- את המספר \(num = 9\) אפשר להציג כך:
\(2^0 + 2^3 = 1 + 8 = 9 \quad \text{factor} = 2\)
וגם כך:
\(3^2 = 9 \quad \text{factor} = 3\) - את המספר \(num = 19\) אפשר להציג כך:
\(2^0 + 2^1 + 2^4 = 1 + 2 + 16 = 19 \quad \text{factor} = 2\) - את המספר \(num = 28\) אפשר להציג כך:
\(2^2 + 2^3 + 2^4 = 4 + 8 + 16 = 28 \quad \text{factor} = 2\)
\(3^0 + 3^3 = 1 + 27 = 28 \quad \text{factor} = 3\) - את המספר \(num = 42\) אפשר להציג כך:
\(2^1 + 2^3 + 2^5 = 2 + 8 + 32 = 42 \quad \text{factor} = 2\)
וגם כך:
\(6^1 + 6^2 = 6 + 36 = 42 \quad \text{factor} = 6\) - את המספר \(num = 73\) אפשר להציג כך:
\(2^0 + 2^3 + 2^6 = 1 + 8 + 64 = 73 \quad \text{factor} = 2\)
וגם כך:
\(8^0 + 8^1 + 8^2 = 1 + 8 + 64 = 73 \quad \text{factor} = 8\) - את המספר \(num = 273\) אפשר להציג כך:
\(2^0 + 2^4 + 2^8 = 1 + 16 + 256 = 273 \quad \text{factor} = 2\)
וגם כך:
\(4^0 + 4^2 + 4^4 = 1 + 16 + 256 = 273 \quad \text{factor} = 4\)
וגם כך:
\(16^0 + 16^1 + 16^2 = 1 + 16 + 256 = 273 \quad \text{factor} = 16\)
שימו לב –
ברור שאפשר להציג כל מספר \(a\) כחזקה \(1\) של המספר \(a\) (כלומר \(a^1\)), וגם כך:
\((a-1)^0 + (a-1)^1\)
לדוגמא, את המספר \(7\) אפשר להציג כך: \(6^0 + 6^1 = 1 + 6 = 7\). אנחנו לא מתכוונים לסכום הזה! את המספר \(7\) אנחנו רוצים להציג כך: \(2^0 + 2^1 + 2^2 = 1 + 2 + 4 = 7\).
כתבו שיטה סטטית רקורסיבית המקבלת כפרמטר מספר שלם חיובי \(num\) כלשהו ומחזירה מהו המספר \(factor\) הגדול ביותר מבין המספרים \(2\) ל- \(num-2\) כך שאפשר לקבל את \(num\) כסכום חזקות של \(factor\), כאשר כל חזקה מופיעה לכל היותר פעם אחת.
אם אין מספר כזה יוחזר \(0\). כמו כן, השיטה תדפיס את פירוט החזקות של \(factor\) שסכומן הוא \(num\).
חתימת השיטה היא:
public static int maxFactor (int num)
בדוגמאות לעיל,
- אם \(num = 9\) – המספר שיוחזר יהיה \(3\) (כי הוא הגדול מבין \(2, 3\)), ויודפס:
9 - אם \(num = 73\) – המספר שיוחזר יהיה \(8\) (כי הוא הגדול מבין \(2, 8\)), ויודפס:
1 8 64 - אם \(num = 273\) – המספר שיוחזר יהיה \(16\) (כי הוא הגדול מבין \(2, 4, 16\)), ויודפס:
1 16 256 - אם \(num = 3\) – המספר שיוחזר יהיה \(0\) (כי אין \(factor\) אפשרי) ולא יודפס כלום.
הנחיות נוספות:
- השיטה צריכה להיות רקורסיבית ללא שימוש בלולאות כלל. כך גם כל שיטות העזר שתכתבו (אם תכתבו) לא יכולות להכיל לולאות.
- אם השיטה שתכתבו רק תחזיר את הגורם המקסימלי, אבל לא תדפיס את הצגת הצירופים, התשובה תהיה חלקית.
- מותר להשתמש בשיטות
Mathובקבועים שלInteger. - מותר להשתמש בהעמסת-יתר (Overloading).
- אין צורך לדאוג ליעילות השיטה, אך יש להימנע מקריאות רקורסיביות מיותרות.
התנאי ש"כל חזקה מופיעה פעם אחת לכל היותר" שקול לכך שבייצוג המספר בבסיס factor, כל הספרות הן אך ורק 0 או 1. חלקו את הבעיה לשתי בעיות משנה: 1. סריקת הפקטורים האפשריים מהגדול לקטן (בצורה רקורסיבית). 2. בדיקה האם מספר מסוים מקיים את התנאי עבור פקטור נתון והדפסתו (גם כן בצורה רקורסיבית, על ידי בדיקת שארית החלוקה בפקטור).
