אהלן חברים.
אני מקבל מספר בינארי מהLSB לMSB וצריך להחזיר בכל CLK האם המספר שנכנס עד עכשיו מתחלק ב3 או לא.
איך ניגשים לשאלה הזו? מה הפתרון אם כך?
תודה רבה.
ע"י: 1_אורח_כללי
צריך להסתכל על המספר בצורה בינארית. לספור את מספר הביטים של "1" במקומות האי זוגיים ואת מספר הביטים של"1" במקומות הזוגיים. אם ההפרש בינהם מתחלק ב3 אז המספר מתחלק ב 3 גם כן.
https://stackoverflow.com/questions/393 ... vides-by-3
ע"י: 1_אורח_כללי
צריך להסתכל על המספר בצורה בינארית. לספור את מספר הביטים של "1" במקומות האי זוגיים ואת מספר הביטים של"1" במקומות הזוגיים. אם ההפרש בינהם מתחלק ב3 אז המספר מתחלק ב 3 גם כן.
https://stackoverflow.com/questions/393 ... vides-by-3
זה לא מספיק. קח לדוגמא את המספר 21: 10101 שמתחלק בשלוש
ע"י: 1_אורח_כללי
ד"א 'ל יותר להנין את מכונת המצבים כאשר הביטים מעיגים מה-MSB ל-LSB (משמאל לימין) כי אז מספר המצב באמת מייצג את השארית.
ע"י: 1_אורח_כללי
הצעת פתרון:
נתחיל מזה שהשאלה מבלבלת, הרבה יותר פשוט כאשר המספרים המגיעים מייצגים את הLSB (לדעתי זה מה ששאלו בראיון, אחרת הם ממש נבזיים) ופה באמת הפתרון הוא מכונת מצבים של 3 כאשר כל מצב מייצג את השארית. אמנם זאת לא השאלה כאן.
הפתרון שלי מתבסס, כמו הפתרון של איתי, על העובדה ש-1 במקום אי זוגי מוסיף שארית 1 ו1 במקום זוגי מוסיף שארית 2, לכן מכונת המצבים שלי מכילה 6 מצבים + מצב INIT.
המצבים הם: ODD 0, ODD 1,ODD 2, EVEN 0 ,EVEN 1, EVEN 2. כאשר המספר מציין את השארית. המשמעות היא כאשר אנחנו במצבים EVEN או ODD זה אומר שהספרה האחרונה שנכנסה היא זוגית או אי זוגית (במילים אחרות מחרוזת הספרות מכילה מספר זוגי/אי זוגי של ספרות). אסביר כמה מצבים כדי שתבינו את הפואנטה, אין טעם להסביר הכל:
INIT - כאשר נכנס 0 עוברים ל ODD 0, כלומר מתחלק ב3. כאשר נכנס 1 עוברים ל ODD 1.
ODD 0 - כאשר נכנס 0 המספר עדיין מתחלק ב3 אבל אנחנו עוברים ל EVEN 0, נכנס 1 עוברים ל EVEN 2 (שוב, זהו ליבו של הפתרון - נכנס 1 במקום זוגי אז קיבלנו תוספת של 2 לשארית).
EVEN 0 - נכנס 0 עוברים לODD 0, נכנס 1 עוברים ל ODD 1 (הסבר נוסף ואחרון , נכנס 1 במקום אי זוגי לכן התווסף 1 לשארית).
ODD 1 - נכנס 0 עוברים לEVEN 1, נכנס 1 עוברים לEVEN 0.
EVEN 2 - נכנס 0 עוברים לODD 2, נכנס 1 עוברים לODD 0.
מקווה שעזרתי.
ע"י: 1_אורח_כללי
מדובר על מכונת מצבים. כל מצב כן מתאר בצורה כלשהי את השארית, אך אינו בהכרח מייצג אותה נכונה.
בסופו של דבר, כאשר המכונה נמצאת במצב 0, אז המספר מתחלק ב-3.
למשל המספר 10 מקבל את מצב 1, אך במקרה זה השארית היא 2. (מכונת המצבים מתעלמת מריפוד אפסים מצד ימין, שכל משמעותה הוא הכפלה ב-2 שאינה משנה את החלוקה או אי החלוקה ב-3).
בנוסף, הוספת 0 מצד שמאל משנה מצב 1 ל-2 ומצב 2 ל-1 (וגם זה סותר את העובדה שהמצב מייצג שארית).
"אלא לטעמי הראייה של המצבים היא אחרת : על מנת למצוא מספר המתחלק ב-3
צריך ,כמו שאמרתי, שני סיגנלים עם ערך 1 במקומות הזוגי והאי זוגי כלומר במספר 1001
יש שני סיגנלי 1 שאחד במקום הזוגי והשני באי זוגי לכן המספר מתחלק ב-3 .
אם למספר יש שני סיגנלים במקומות אחרים לדוג,1010 שני מקומות זוגיים המספר אינו מתחלק !"
ההנחה שלך אינה נכונה. המספר 010101 או 101010 מכילים "1" רק במקומות זוגיים או אי-זוגיים ובכל זאת מתחלקים ל-3.
לפעמים מצב הוא רק מצב (באותה מידה יכולתי לסמן את המצבים כ Sa, Sb, Sc ולא עם המספרים 0,1,2)
ע"י: 1_אורח_כללי
אהלן חברים.
אני מקבל מספר בינארי מהLSB לMSB וצריך להחזיר בכל CLK האם המספר שנכנס עד עכשיו מתחלק ב3 או לא.
איך ניגשים לשאלה הזו? מה הפתרון אם כך?
תודה רבה.
באיזה חברה התראיינת?
ע"י: אבי_27
אני חושב שהבנתי בערך את הקושי שלי :
מצבים 0,1,2 אינם מוגדרים
מצב 0 -שארית 0
מצב 1 -שארית 1
מצב 2 -שארית 2
אלא לטעמי הראייה של המצבים היא אחרת : על מנת למצוא מספר המתחלק ב-3
צריך ,כמו שאמרתי, שני סיגנלים עם ערך 1 במקומות הזוגי והאי זוגי כלומר במספר 1001
יש שני סיגנלי 1 שאחד במקום הזוגי והשני באי זוגי לכן המספר מתחלק ב-3 .
אם למספר יש שני סיגנלים במקומות אחרים לדוג,1010 שני מקומות זוגיים המספר אינו מתחלק !
המכונת מצבים נכונה ועובדת אבל אולי הראייה של איפיוני המצבים היא כמו שציינתי ? מה אתה אומר ?
ע"י: אבי_27
אהלן ,
או שלא הבנתי משהו בפתרון או שיש בעיה קטנה בפתרון :
אתה אומר שכל עוד נכנס רק הערך 0 נשאר במצב 0 - מעולה
הרי המספר 0 מתחלק ב-3 ללא שארית .
הבעיה שברגע שנכנס הסיגנל 1 אתה אמרת שעוברים(ללא תנאי) למצב 1
יש כאן בעיה הרי יש הבדל בין 1 שנכנס אחרי שני אפסים - במקרה הזה השארית היא 1
או 1 שנכנס אחרי 0 אחד -במקרה הזה השארית היא 2
ע"י: 1_אורח_כללי
תודה רבה! עזרת לי מאוד. וכל הכבוד על ההשקעה בתשובה.
ע"י: 1_אורח_כללי
כי מטרת מכונת המצבים להתייחס למיקום של ה-1 שמתקבל.
למשל דין 101 אינו כדין 011
אם אתה זוכר, רשמתי שאת הביטים מחלקים לשני צמדים, צמדים עם אינדקס זוגי, וצמדים עם אינדקס לא זוגי.
כאשר מגיע ה-1 הראשון, אז המצב הופך ל-1. אם עכשיו מגיע 1 אז הוא מגיע באינדקס זוגי, אבל אם מגיע 0 ואז אחד, אז ה-1 מגיע באינדקס אי זוגי.
אפשר גם לבנות מערכת שבה הביטים מגיעים מה-msb ל lsb. מכונת המצבים תהיה אותה מכונת מצבים.
חיפשתי קצת באינטרנט לגפי פתרונות לבעיה ומצאתי שני אתרים:
http://geeki.wordpress.com/2008/01/03/f ... ible-by-3/
והשני:
http://gadial.blogli.co.il/archives/date/2009/08/
(חפש "שמתחלק ב-3 ללא שארית" בתוך המאמר).
שניהם מראים שמכונת המצבים שקיבלתי היא נכונה.
ע"י: 1_אורח_כללי
איתי - נראה שמכונת המצבים שלך עובדת, ועם זאת, לא ברור לי מעבר אחד (לא ברור לי למה הוא נכון, למרות שבפועל זה עובד):
כשנמצאים במצב 1, ומגיע 0 ההגיון אומר שאמורים להישאר במצב 1, שהרי 0 שהגיע הוא ה-MSB הנוכחי והוא לא משנה את המספר לפיכך השארית נשארת כשהייתה (היינו 1).
ועם זאת - המעבר שאתה הצעת נראה נכון כי עובדה שזה עובד (לפחות על מספר קלטים שניסיתי)
למה?
ע"י: 1_אורח_כללי
אם למישהו יש השגה על מה שרשמתי (כי אולי זה לא נכון) בבקשה העירו.
אילתרתי את מכונת המצבים הזו עכשיו (זה לא פתרון שידוע לי או שאלה שהכרתי מלפני כן, למרות שכרגע הפתרון נראה נכון)
ע"י: 1_אורח_כללי
דבר ראשון, הוא רשם שאם מתקבל בסוף אפס, אז המספר מתחלק ב-3 (כלומר תבצע Not על התוצאה הסופית).
אבל בלי שום קשר, הפתרון שהוצע איננו נכון. הפתרון אומר שאם מתקבל 1 עלים את המונה באחד, ואם מתקבל 0 אז מורידים את המונה ב-1
לכן לפי ההגיון 10 (כלומר 2) מתחלק ב-3
בנוסף, לפי ההגיון שהוצע, ריפוד באפסים (אם מימין או משמאל משנה את התוצאה הסופית, מה שמן הסתם לא נכון).
הפתרון הנכון הוא מצב ולא מונה, כאשר למצב (State) ישנן 3 אפשרויות:
מצב 0
מצב 1
מצב 2
כאשר נמצאים במצב 0, אז המספר מתחלק ב-3. מתחילים את הבדיקה כאשר הבערכת נמצאת במצב 0. כפי שתארת את הבעיה, מקבלים את הספרים מה-LSB ל MSB. המצב בעצם מייצג את השארית.
כאשר נמצאים במצב 0:
1) כאשר מתקבל 0 - נשארים במצב 0
2) כאשר מתקבל 1 - בעצם הוספנו 1 ומספר, ולכן בשארית גדלה ב-1, כלומר המצב הוא 1
כאשר נמצאים במצב 1:
1) כאשר מתקבל 0 - עוברים למצב 2
2) כאשר מתקבל 1 - עוברים למצב 0
כאשר נמצאים במצב 2:
1) כאשר מתקבל 0 - עוברים למצב 1
2) כאשר מתקבל 1 - נשארים במצב 2
אני אנסה להסביר את ההגיון שעומד מאחורי מכונת המצבים הזו... מספר שמתחלק ב-3 הוא מספר שמתחלק ב 2+1
אפשר לחלק מספר שמיוצג בבינארי לצמדים: כל הביטים שנמצאים במיקום אי זוגי, וכל הביטים שנמצאים במיקום זוגי.
"1" שנמצא במיקום אי זוגי (למשל ה -LSB) מוסיף 1 לשארית.
"1" שנמצא במיקום זוגי מוסיף 2 לשארית.
לכן 1001 (כלומר 9) מכיל 1 + 8 (ביט אחד במיקום זוגי, וביט אחד במיקום אי זוגי) ולכן מתחלק ב-3.
זה ההגיון שגורר הפיכת מצב 1 ל-2 ומצב 2 ל-1 בכל פעם שמתקבל 0.
ע"י: אלי_אזו
לפי טענתך, אם קיבלתי 11, שזה 3 בעצם, המונה שלי לא מאופס ולכן אוציא '0' כאילו זה מספר שלא מתחלק ב3...לא?
ע"י: 1_אורח_כללי
לפי דעתי אתה צריך לעשות מונה אחד שכל פעם שמתקבל 1 עולה באחד, וכשמתקבל אפס יורד ב 1
אם המונה הוא 0, אז המספר מתחלק ב 3....