Zippo
חבר מתאריך 26.5.02
7921 הודעות |
10:59 08.03.13 |

|
6. איזה כיף לשמוע שהחתימה שלי אשכרה שימושית :)
בתגובה להודעה מספר 0
 |
ערכתי לאחרונה בתאריך 11.03.13 בשעה 12:40 בברכה, Zippo עריכה: אחרי שפתחת לי את התיאבון, וניסיתי את הבעיה בעצמי, זה הרבה יותר פשוט ממה שחשבתי. לא אתן לך פיתרון מלא, אבל הנה הרעיון הכללי: המספר המקסימלי שיכול להיות המספר הריבועי הוא: 1929394959697989990 (ובעצם 19293949596979899-0-0 ע"פ הגיון שכבר הוסבר מקודם.) המספר המינימלי הוא: 10203040506070809000. אז אתה מחפש מספר שהוא בין השורש של 1929394959697989900 לשורש של 10203040506070809000. אבל לא חייבים לבדוק כל מספר... כמו שהוסבר כבר מקודם, על כל 100 מספרים, מספיק לבדוק 4. כל אלה שהם כפולות של 10, אבל לא כפולות של 4 או 25. מפה, זה כבר ממש פשוט, ונפתר בערך ב-15 שורות קוד... בהצלחה  לגבי השאלה, תצמצם אפשרויות בהגיון. למשל, הספרה האחרונה היא 0, כלומר הריבוע מתחלק ב-10, כלומר יש גורמים ראשוניים 2 ו-5, אבל הם חייבים להיות גם בשורש, וכשמעלים בריבוע, אז יש כפול 2 מכל גורם, כלומר המספר הריבועי מתחלק ב-2 בריבוע וב-5 בריבוע, כלומר מתחלק ב-100, כלומר הספרה האחרונה הלא ידועה חייבת להיות 0. והנה הורדת פי-10 את מספר האפשרויות לחיפוש. אולי אפשר לצמצם ככה עוד כמה ספרות, אין לי עליי דף ונייר בשלוף, אבל תנסה לשחק עם המספרים ולצמצם את מרחב החיפוש. בהצלחה!
עריכה: לפי ההגיון הנ"ל, אפשר להגיע למסקנה, שהשורש של המספר המבוקש, לא רק שמתחלק ב-2 וגם ב-5, אלא אפילו שהוא לא מתחלק ב-4 או ב-25. (למה? תחשוב.. ) זה מאד מאד מצמצם את מרחב החיפוש שלך. אתה מחפש רק שורשים שהם כפולות של 10, אבל לא מתחלקים ב-4 או 25. מה גם שהשורש חייב להיות בן 9 ספרות, כשה-MSD הוא לפחות 3, אבל לא יותר מ-4. (שוב, תנסה לחשוב למה...) אם כך, כל המספרים בין 300000000 ל- 499999999 (ואפשר לצמצם אפילו יותר עם חישוב זהיר) שמתחלקים ב-10, אבל לא ב-4 או 25, סה"כ יש לך מרחב חיפוש של: 8000000 מספרים. 8 מיליון זה כבר מרחב חיפוש מספיק קטן כדי לפתור את השאלה בעזרת brute force.
מקווה שזה עוזר. בהצלחה!
 |
|
(ניהול: מחק תגובה) |
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
|
| |