עבור לתוכן

תרגיל בעייתי שנתקלתי בו במבחנים של גאמא

Featured Replies

פורסם

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

התכנית מקבלת מספרים N ו D (שלמים וחיוביים, N<D) ומדפיסה את N/D כמספר עשרוני באופן הבא:

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

1/4 = 0.25 -> 0.25
1/7 = 0.142857142... -> 0.(142857)
5/6 = 0.8333... -> 0.8(3)

הם גם הוסיפו שבשביל הפשטות אפשר להניח ש N ו D הם בין 1-9, אם זה משנה.

למישהו יש פתרון אלגנטי לבעיה?

פורסם

למצוא את הסגנון של ה 1/7 הצלחתי יפה

אבל הבעיה הייתה ליצור אלגוריתם כולל שיעבוד על ה 5/6

קצת יותר בעייתי

אני עדיין חושב על משהו שיכלול הכל

אני בטוח שהם לא מצפים שנרשום פה תוכנית מסובכת , כי ככה מבינים שהבנאדם לא חושב

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

כי ברגע שאמרו לך זהם קטנים מ10 כלומר בין 1-9 זה יהיה משהו שעובד על ספירה עשרונית

יכול ליהיות שאני טועה, אבל סביר להניח שזה ככה

אני אמשיך לחשוב ואעדכן אותך

פורסם

הנה פתרון אפשרי, אפשר להרחיב את זה למקרים יותר כללים מההגבלות של 1-9, אבל אז צריך לממש חילוק שלם מלא יותר:


using System;
using System.Collections.Generic;
using System.Text;

namespace sequence
{
class Program
{
static string Sequence(int n, int d)
{
if (n < 1 || n > 9 | d < 1 || d > 9 || n >= d)
throw new Exception("go to hell");
StringBuilder str = new StringBuilder("0.");
List<int> reminders = new List<int>();
int t = n;
while (t != 0)
{
if (t < d)
t *= 10;
if (reminders.IndexOf(t) != -1)
break;
reminders.Add(t);
t = t - d * (t / d);
}
foreach (int i in reminders)
{
if (i == t)
str.Append('(');
str.Append(i / d);
}
if (t != 0)
str.Append(')');
return str.ToString();
}

static void Main(string[] args)
{
for (int x = 1; x <= 9; x++)
for (int y = 1; y < x; y++)
Console.WriteLine("{0}/{1}={2}", y, x, Sequence(y, x));
Console.ReadKey();
}
}
}

פורסם
  • מחבר

תודה על התגובות.

לא נראה לי שאני אבין את הפתרון שלך בקרוב, אבל הוא עובד מצויין ;D

פורסם

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

ארכיון

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

דיונים חדשים