לחץ ▶ Run כדי להדר ולהריץ את הקובץ. אם התוכנית תבקש קלט, תוכל להקליד אותו כאן למטה.
לכל סעיף ציינו סיבוכיות זמן וסיבוכיות מקום נוסף, בסימון Θ, כפונקציה של n.
חובה לפשט את הביטוי ככל שניתן. הניחו כי סיבוכיות הזמן והמקום של printf ו-free היא Θ(1),
וכי סיבוכיות הזמן של malloc(n) היא Θ(1) וסיבוכיות המקום שלה היא Θ(n).
הניחו כי sqrt פועלת בזמן Θ(1).
שימו לב: אין הבטחה ששלושת הסעיפים מקבלים תשובות שונות.
חשבו כל סעיף מחדש — ובפרט שימו לב לערכי חזרה של פונקציות עזר, למשתנים שמשתנים בין איטרציות,
ולמיקום של free ביחס לקריאה הרקורסיבית.
א.
void f1(int n) {
int i = 0;
while (i * i < n) {
for (int j = 0; j < i; j++)
printf("*");
i++;
}
}
ב.
void f2(int n) {
int m = 1;
for (int i = n; i > 1; i /= 2) {
for (int j = 0; j < m * n; j++)
printf("*");
m *= 2;
}
}
ג.
void f3(int n) {
for (int i = n; i > 2; i = (int) sqrt(i))
printf("*");
}
נתון מערך arr באורך n של מספרים שלמים אי-שליליים,
ומספר שלם D המקיים 1 ≤ D ≤ n.
יש לחלק את המערך, לפי הסדר, ל-D קבוצות רציפות ולא ריקות בדיוק.
עלות החלוקה היא סכום האיברים של הקבוצה שסכומה הגדול ביותר.
על הפונקציה להחזיר את העלות המינימלית האפשרית על פני כל החלוקות החוקיות.
| קלט | פלט | הסבר |
|---|---|---|
| arr = {7,2,5,10,8}, n = 5, D = 2 | 18 | {7,2,5} ו-{10,8} |
| arr = {1,2,3,4,5}, n = 5, D = 2 | 9 | {1,2,3} ו-{4,5} |
| arr = {1,...,10}, n = 10, D = 5 | 15 | — |
| arr = {3,3,3,3,3}, n = 5, D = 1 | 15 | קבוצה אחת בלבד |
n ≥ 1 וכי כל האיברים אי-שליליים.S את סכום כל איברי המערך.נתונה מחרוזת s באורך n המכילה אותיות אנגליות קטנות ותווי '$' בלבד.
מילה היא רצף רציף ומקסימלי של אותיות. רווח הוא רצף רציף ומקסימלי
של תווי '$'. לכל רווח יש מילה שמאלית ומילה ימנית — ואם הרווח נמצא
בתחילת המחרוזת או בסופה, אורך המילה החסרה נחשב 0.
יש להחליף כל רווח בתו בודד, לפי הכלל:
'+' — אם אורך הרווח גדול ממש משתי המילים השכנות;'*' — אם אורך הרווח קטן ממש משתי המילים השכנות;'=' — בכל מקרה אחר.על הפונקציה לבצע את ההחלפות במקום, בתוך s עצמה (תוך הזזת שאר
התווים שמאלה וסיום ב-'\0'), ולהחזיר את מספר הרווחים שהוחלפו ב-'='.
| קלט | פלט | s לאחר הקריאה |
|---|---|---|
| s = "ab$$$cd" | 0 | "ab+cd" (3 > 2 וגם 3 > 2) |
| s = "qq$$ww$e" | 2 | "qq=ww=e" |
| s = "a$$$b$c" | 1 | "a+b=c" |
| s = "$$ab" | 1 | "=ab" (שמאלה אין מילה, אורך 0) |
s אינה ריקה.נתונים שני מספרים שלמים: n חיובי, ו-k אי-שלילי.
פירוק מסודר של n לאורך k הוא סדרה של k
מספרים שלמים, כל אחד גדול או שווה ל-2, שמכפלתם היא n.
שני פירוקים נחשבים שונים אם סדר הגורמים בהם שונה — כך
2×6 ו-6×2 הם שני פירוקים שונים של 12.
על הפונקציה להחזיר את מספר הפירוקים המסודרים של n לאורך
k בדיוק. עבור k = 0 יש פירוק אחד אם n = 1, ואפס אחרת.
| קלט | פלט | הסבר |
|---|---|---|
| n = 12, k = 2 | 4 | 2×6, 3×4, 4×3, 6×2 |
| n = 12, k = 3 | 3 | 2×2×3 בשלושת הסדרים |
| n = 7, k = 2 | 0 | 7 ראשוני |
| n = 8, k = 3 | 1 | 2×2×2 |
רמז: קבעו את הגורם הראשון וסכמו על כל האפשרויות. הסכימה על המחלקים היא לולאה במקורה — ולכן גם היא חייבת להפוך לרקורסיה נפרדת.
examT_q4 רשאית לקרוא לפונקציית עזר רקורסיבית.main./grade.