תרגיל בשפת C - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תרגיל בשפת C


Dolmiti

Recommended Posts

אם מותר להשתמש בפונ' חיצוניות אז ע"י strlen תוכל למצוא את אורך המחרוזת ואם אסור אז תעבור על המחרוזת פעם אחת ותשמור את אורכה ע"י משתנה b  שגדל בכל איטרציה עד שאתה מזהה את התו של סוף מחרוזת. 

 

לאחר מכן תוכל לעבור על המחרזות מהסוף להתחלה ולחשב את ערכה כאילו שאין בכלל נקודה (להתחיל מהכפיל ב1, ואז 16 וכו') 

כעת res מחזיק בתוצאה שהיא גדולה פי 16 בחזקת גורם שקשור למיקום הנקודה. אז נצטרך לחלק

 

שוב נשים בb את גודל המחרוזת ונעבור עליה משמאל לימין

אך (כלומר בכל איטרציה מקטינים את b באחד ומסתכל התו במיקום s+b-1)

כעת בכל איטרציה פשוט מחלקים את res פי 16 עד שמגיעים לתו הנקודה ועוצרים. כך חוסכים את העיניין של לזכור איפה הייתה הנקודה. 

 

הנחתי כאן שניתן להשתמש ממש רק בb, res וs בלי פונ' עזר

 

קישור לתוכן
שתף באתרים אחרים

ציטוט של exeaction

אם מותר להשתמש בפונ' חיצוניות אז ע"י strlen תוכל למצוא את אורך המחרוזת ואם אסור אז תעבור על המחרוזת פעם אחת ותשמור את אורכה ע"י משתנה b  שגדל בכל איטרציה עד שאתה מזהה את התו של סוף מחרוזת. 

 

לאחר מכן תוכל לעבור על המחרזות מהסוף להתחלה ולחשב את ערכה כאילו שאין בכלל נקודה (להתחיל מהכפיל ב1, ואז 16 וכו') 

כעת res מחזיק בתוצאה שהיא גדולה פי 16 בחזקת גורם שקשור למיקום הנקודה. אז נצטרך לחלק

 

שוב נשים בb את גודל המחרוזת ונעבור עליה משמאל לימין

אך (כלומר בכל איטרציה מקטינים את b באחד ומסתכל התו במיקום s+b-1)

כעת בכל איטרציה פשוט מחלקים את res פי 16 עד שמגיעים לתו הנקודה ועוצרים. כך חוסכים את העיניין של לזכור איפה הייתה הנקודה. 

 

הנחתי כאן שניתן להשתמש ממש רק בb, res וs בלי פונ' עזר

קלטתי שכל זה לא נכון כיוון שיש בעיה עם ההכפלות פי 16 בחזקת גורם עולה כי אין את הגורם העולה הזה /;

אז נשנה קצת ונרוץ על המחרוזת מההתחלה לסוף כאשר b המשתנה הגדל ב1 בכל איטרציה. 

בכל שלב באיטרציה נוסיף לres את ערך התו המתאים ואז נכפיל את res פי 16. כל למשל, אם אורך המחרוזת היא abc.d

ערכו של res יהיה a*16^4+..d*16^1

נחלק ב16 ואז נגיע למצב שיש חישוב ערך ללא התחשבות בנקודה, ואז להתקדם עם השלב השני שהצעתי 

ציטוט של exeaction

 

 

קישור לתוכן
שתף באתרים אחרים

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

בפתרון שלך אין חזקות שליליות. למשל עבור המחרוזת שלך abc.d צריך a*16^2+b*16^1+c*16^0+d*16^-1

 

רעיון נוסף?

קישור לתוכן
שתף באתרים אחרים

ציטוט של Dolmiti

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

בפתרון שלך אין חזקות שליליות. למשל עבור המחרוזת שלך abc.d צריך a*16^2+b*16^1+c*16^0+d*16^-1

 

רעיון נוסף?

יש חזקות שליליות כיוון שבצעד השני עוברים על המחרוזת מימין לשמאל ומחלקים ב16 בכל איטרציה,
אחרי חישוב a*16^3+...+d, עוברים מימין לשמאל, נתקליחם למשל בתו d ולכן מחלקים ב16 ומקבלים a*16^2+...d*16^-1 ולאחר מכן נתקלים בתו '.' וסיימנו.  כן פיספסתי שמותר לעבור על המערך פעם אחת, וכאן אני עובר על המערך משהו כמו פעם וחצי..

 

קישור לתוכן
שתף באתרים אחרים

אחרי שיש את הפתרון עד הנקודה ההמשך הוא טריוויאלי:

- מחזיקים ב-b את 1/16 ממשיכים לסרוק מהנקודה ימינה

- בכל איטרציה מכפילים את b בתו הנוכחי מהחרוזת ומחברים את התוצאה ל-res ואז מחלקים את b ב-16

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...