עבור לתוכן

C# - בעיה בפעולות על מספרים גדולים

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

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

הקוד שכתבתי:

    static String getStr(int n, int d)
{
String result = "0.";
List<int> staticDigits = new List<int>();
List<int> dynamicDigits = new List<int>();
int t = n * 10; ;
while (staticDigits.IndexOf((t / d)%10) == -1)
{
staticDigits.Add((t / d)%10);
t *= 10;
}
do
{
staticDigits.Remove((t / d) % 10);
dynamicDigits.Add((t / d) % 10);
t *= 10;
}
while (staticDigits.Count != 0 && staticDigits.IndexOf((t / d) % 10) != -1);
for (int i = 0; i < staticDigits.Count; i++)
result += staticDigits[i];
if (dynamicDigits.Count == 0 || dynamicDigits[0] == 0)
return result;
else
{
result += "(";
for (int i = 0; i < dynamicDigits.Count; i++)
result += dynamicDigits[i];
result += ")";
return result;
}
}
static void Main(string[] args)
{
for (int i = 1; i <= 9; i++)
for (int j = 1; j < i; j++)
Console.WriteLine(j + "/" + i + " = " + getStr(j,i));

}

הפלט:

1/2 = 0.5
1/3 = 0.(3)
2/3 = 0.(6)
1/4 = 0.25
2/4 = 0.5
3/4 = 0.75
1/5 = 0.2
2/5 = 0.4
3/5 = 0.6
4/5 = 0.8
1/6 = 0.1(6)
2/6 = 0.(3)
3/6 = 0.5
4/6 = 0.(6)
5/6 = 0.8(3)

-------------------
1/7 = 0.87(1425)
2/7 = 0.714(285)
3/7 = 0.8571(42)
4/7 = 0.1428(57)
5/7 = 0.4285(71)
6/7 = 0.7142(85)
-------------------

1/8 = 0.125
2/8 = 0.25
3/8 = 0.375
4/8 = 0.5

פורסם

אתה מכיר את המושג "להשתמש בתותח כדי להרוג נמלה" ?

אתה משתמש בlist בשביל דבר כל כך פעוט ?

(ואגב- זה

while (staticDigits.Count != 0 && staticDigits.IndexOf((t / d) % 10) != -1);

מקור הבעיה - תרוץ עם הdebugger ותראה בעצמך).

הפתרון לא יעיל. אנא נסה גישה פשוטה יותר (הכוללת אולי רק שימוש באופרטור % ו\ פחות משתנים).

פורסם
  • מחבר

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

    static void getStr2(double x, double y)
{
double z = (x / y) * 10;
String st1 = "";
st1 += (int)(z % 10);
do
{
z *= 10;
st1 += (int)(z % 10);
}
while (!st1[0].Equals(st1[st1.Length - 1]) && (!st1[st1.Length - 2].Equals(st1[st1.Length - 1])));
if (st1[0].Equals(st1[st1.Length - 1]))
Console.WriteLine("0.({0})", st1.Remove(st1.Length - 1));
else
{
if (st1[st1.Length - 1].Equals('0')) Console.WriteLine("0.{0}",st1.Remove(st1.Length - 2));
else Console.WriteLine("0.{1}({0})", st1[st1.Length - 1], st1.Remove(st1.Length - 2));
}
}

פורסם

הפתרון שהם מתכוונים אליו הוא הרבה יותר פשוט עד כמה שאני יודע...

לא סתם נתנו לך את הנתון שאפשר להניח שמדובר עד 9...

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

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

כתיבת פעולה שתעשה את זה מסובת ומיותרת בעליל.

בהצלחה.

פורסם

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

ארכיון

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

דיונים חדשים