פונקציית XOR

pitbol3

New member
פונקציית XOR

אהלן,

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

אני צריך לשלוח אותם לפונקציה שתעשה את ה XOR שלהם( שזה לא בעיה), ואז תמיר אותם למספר בבסיס עשרוני.(פונקציה רקורסיבית). אסור להשתמש בלולאות בכלל!

הבעיה כאן היא שהפונקציה צריכה לקבל שלושה ארגומנטים בלבד והם : number1[], number2[] , length. האורך כמובן מתקבל כקלט מהמשתמש.

להמיר את המספרים לXOR זו לא בעיה, אבל להפוך אותם לעשרוניים במקביל להמרה ומבלי להוסיף ארגומנט זו בעיה.

כי נניח אני כל פעם אקרא לפונקציה ברקורסיה ואסתכל על התא length-1 בשני המספרים, אם הם שווים אז זה יחזיר 0, אם הם שונים אז 1. אבל ישנה בעיה של ההכפלות ב 2,

איך הפונקציה תדע כמה פעמים היא צריכה להכפיל ב 2?

תודה
 

BravoMan

Active member
הנה רמז עבה (לדעתי) לפתרון התרגיל:

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

השאלה האמתית היא האם מותר לך להשתמש בפונקציות מתמטיות, ספציפית pow, או שאתה גם צריך למצוא עוד שיטה לחשב חזקה ללא לולאה?

בנוסף, תנאי העצירה שלך לא חייב להיות שהאורך הוא אפס, למעשה, במקרה הזה הגיוני לעצור באורך 1, כי בעורך 0, אין כבר מה לחשב.

ולבסוף 2 הערות על הקוד שכתבת:
1. אם הגדרת שפונקציה מחזירה ערך, למשל int, אסור לך בשום פנים ואופן לכתוב בה return ללא ערך.

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

תמיד חייבים לבדוק את תקינות האינדקס לפני שמנסים להשתמש בו!
 

pitbol3

New member
אממ

ככה,

אסור להשתמש בפונקציות מתמטיות, אחרת זה היה שאלה הרבה יותר קלה...

לגבי 1 ו 2 זה ידוע לי, כתבתי שם סתם סימן שאלה ולגבי 2 זה ברור...שוב כתבתי סתם קוד כדי לתת "תחושה".


ברור לי שנניח אם האורך 4, אז החזקה של a0 תיהיה 3... וזה הקשר בין האורך לחזקה
 

nahsh

New member
אם אתה מחשב את החזקה לפי האורך - פספסת

כל הרעיון של הרקורסיה מתפספס אם אתה משתמש באורך לצורך חישוב.

אתה צריך "לצבור" את המספר כל פעם - להוסיף לו את הMSB אחרי שהזזת אותו מקום אחד.
 

pitbol3

New member
אני חושב שהבנתי אותך

נניח ה XOR הוא 0110, אז אפשר להמיר את זה ל 0420 ואז פשוט מחברים את כל האיברים ומקבלים 0+4+2+0=6...

הבעיה היא שאין לי מושג איך אני אמור לכתוב את זה...
 
בבקשה (למרות שזה הרגל רע)

העיקרון הוא פשוט - כשמוסיפים ספרה מימין למספר בינארי, בעצם מכפילים אותו פי 2, ומוסיפים את ערכה של הספרה
 
למעלה