עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

חידה חביבה בתוכנות

Featured Replies

פורסם

למביני עניין, הנה חידה חביבה:

כתבו פקודה שמחזירה האם מספר הקלט (INTEGER) הוא חזקה של 2 (יש פתרון לוגוריטמי שהוא פחות יפה, ופתרון הרבה יותר פשוט ויפה במשחקים בינארים).

פורסם

לבדוק אם הראשון הוא 0 וכל מה שאחריו הוא 1, עד שמגיעים לרצף אפסים.

למשל:

00011110 חזקה

00000010 חזקה

00100100 לא חזקה

00000001 לא חזקה

לבדוק אם יש אחדים באמצע שיש ביניהם 0 או הראשן לא מתחיל ב0

פורסם
  • מחבר

דבר ראשון, אתה לא בכיוון, שאלתי חזקה של 2, לא כפולה של 2

11110 = 30 שזה לא חזקה של 2.

דבר שני אמרתי לכתוב פקודה (עדיף בשורה אחת) שעושה את זה, לא שאלתי איך זה אמור להיראות (תחשוב אולי בכיוון של BITWISE OPERATIONS)...

פורסם

הרעיון הוא שצריך להיות רק ביט אחד דולק.

למשל: 01000000 חזקה של 2

לעומת זאת : 01001000 - לא חזקה של 2

חשבתי על משהו לא יעיל במיוחד, אבל הוא צריך לעבוד (לא בדקתי):

for (i=0; (i < sizeof(num)*8) && (((num >> i) & 1) != 1) ; i++);
if ((i < sizeof(num)*8) && ((num >> i) == 1))
<Power of two>

הרעיון הוא שעוברים על כל המספר ובודקים את הספרה הנוכחית היא 1 ואם המספר שנשאר הוא גם אחד (זאת אומרת שיש רק ביט אחד דולק). ואז המספר הוא חזקה של 2.

פורסם
  • מחבר

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

פורסם

!(a & (a-1))

אמיתי לחזקה (שלמה) של שתיים ולאפס.

פורסם
  • מחבר

?!?!?!? קוד C

יעני

int function (int number) { return (some_code());} GOT IT

?

פורסם

int chk_pow_2(int num)

{

return !(num & (num-1));

}

פורסם
  • מחבר

דבר ראשון סליחה, לא ראיתי שענית בפוסט הקודם שלך (IP)

דבר שני, כל הכבוד :)

דבר אחרון, צריך גם לבדוק שהמספר הוא לא אפס

int is_pow_log(int v)

{

double a = log10(v)/log10(2);

return (a == round(a)) ? 1 : 0;

}

int is_pow_bit(int v)

{

return !(v & (v - 1)) && v;

}

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

פורסם

int is_pow_log(int v)

{

        double a = log10(v)/log10(2);

        return a == (int)(a);

}

יעשה את העבודה

  • 3 חודשים מאוחר יותר...
פורסם
  • מחבר

יעשה את העבודה

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

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.