לחץ ▶ Run כדי להדר ולהריץ את הקובץ. אם התוכנית תבקש קלט, תוכל להקליד אותו כאן למטה.
לכל סעיף ציינו סיבוכיות זמן וסיבוכיות מקום נוסף, בסימון Θ, כפונקציה של n.
חובה לפשט את הביטוי ככל שניתן. הניחו כי סיבוכיות הזמן והמקום של printf ו-free היא Θ(1),
וכי סיבוכיות הזמן של malloc(n) היא Θ(1) וסיבוכיות המקום שלה היא Θ(n).
הניחו כי sqrt פועלת בזמן Θ(1).
שימו לב: אין הבטחה ששלושת הסעיפים מקבלים תשובות שונות.
חשבו כל סעיף מחדש — ובפרט שימו לב לערכי חזרה של פונקציות עזר, למשתנים שמשתנים בין איטרציות,
ולמיקום של free ביחס לקריאה הרקורסיבית.
א.
int g(int n) {
int s = 0;
for (int i = 0; i < n; i++)
s += i;
return s;
}
void f1(int n) {
for (int i = n; i > 0; i /= 2) {
int* p = (int*) malloc(i * sizeof(int));
if (p == NULL) return;
int k = g(i);
for (int j = 0; j < k; j++)
printf("*");
free(p);
}
}
ב.
void f2(int n) {
for (int i = n; i > 0; i /= 2) {
int* p = (int*) malloc(i * sizeof(int));
if (p == NULL) return;
for (int j = 0; j < i; j++)
printf("*");
free(p);
}
}
ג.
int f3(int n) {
if (n <= 1) return 1;
return f3(n - 1) + f3(n - 2);
}
הגדרה: מערך arr באורך n ייקרא מערך עמק
אם קיים אינדקס p, כאשר 0 < p < n-1, כך ש-
arr[0] > arr[1] > ... > arr[p] (יורד ממש עד p), וגםarr[p] < arr[p+1] < ... < arr[n-1] (עולה ממש מ-p והלאה)כלומר המערך יורד ממש עד לאיבר מינימלי יחיד ואז עולה ממש. האינדקס p אינו נתון.
הפונקציה מקבלת מערך עמק, את אורכו, ומספר שלם x.
על הפונקציה להחזיר את מספר האיברים במערך הקטנים ממש מ-x.
| קלט | פלט | הסבר |
|---|---|---|
| arr = {9,6,3,1,4,7,10}, n = 7, x = 5 | 3 | האיברים 3, 1, 4 |
| arr = {9,6,3,1,4,7,10}, n = 7, x = 2 | 1 | רק האיבר 1 |
| arr = {9,6,3,1,4,7,10}, n = 7, x = 1 | 0 | אין איבר קטן מ-1 |
| arr = {100,50,10,60,90}, n = 5, x = 55 | 2 | האיברים 50, 10 |
n ≥ 3 וכי כל האיברים שונים זה מזה.x אינם יושבים ברצף אחד — הם מתחלקים בין
שתי הצלעות של העמק, ובכל צלע הם תופסים קטע רציף בקצה אחר.נתונה מחרוזת s באורך n המכילה אותיות אנגליות קטנות בלבד.
נגדיר את התהליך הבא: כל עוד קיימת במחרוזת תת-מחרוזת רציפה "ab", מוחקים אותה
ומצמידים את שני חלקי המחרוזת. התהליך חוזר על עצמו עד שלא נותרה אף הופעה של "ab".
ניתן להראות שהמחרוזת הסופית ומספר המחיקות אינם תלויים בסדר שבו בוחרים את ההופעות.
על הפונקציה לבצע את התהליך במקום, בתוך s עצמה, ולהחזיר את מספר המחיקות הכולל.
יש להקפיד שהמחרוזת הסופית תסתיים ב-'\0'.
| קלט | פלט | s לאחר הקריאה |
|---|---|---|
| s = "cababd" | 2 | "cd" |
| s = "aabb" | 2 | "" (מחרוזת ריקה) |
| s = "ba" | 0 | "ba" |
| s = "aaabbb" | 3 | "" (מחרוזת ריקה) |
s אינה ריקה.נתון מספר שלם ואי-שלילי n.
נסתכל על הייצוג הבינארי של n. רצף אחדות הוא קטע רציף ומקסימלי
של ביטים שערכם 1.
על הפונקציה להחזיר את אורכו של רצף האחדות הארוך ביותר בייצוג הבינארי של
n (0 אם n הוא 0).
| קלט | פלט | הסבר |
|---|---|---|
| n = 13 | 2 | 1101 — הרצף הארוך הוא "11" |
| n = 15 | 4 | 1111 |
| n = 21 | 1 | 10101 — אין שני אחדות סמוכים |
| n = 29 | 3 | 11101 |
רמז: אורך הרצף שמתחיל בביט הנוכחי ואורך הרצף הארוך בהמשך המספר הם שני חישובים נפרדים — ושניהם רקורסיביים.
examT_q4 עצמה חייבת לקרוא לעצמה.main./grade.