תרגיל בC

asi123456789

New member
תרגיל בC

אז ככה, צריך לקחת שני מספרים גדולים, כלומר להכניס אותם למערך בתור string ואז לבצע עליהם פעולות חיבור, חיסור וכפל. מותר להשתמש רק בstrlen, strcpy, strcat, strcmp. מה שאני שובר עליו את הראש, זה איך לעשות פעולות כאלו על string שהרי בתוך המערך הכל תווים, נכון? מישהו יכול להביא לי רק את הרעיון איך לעשות את זה? תודה מראש.
 

immortalus

New member
אני לא ממש בטוח מה הקשר של הפונק' הנ"ל...

הן לא ממש יעזרו לך לעשות פעולות מתמטיות, אבל תחשוב שכל CHAR הוא בעצם מספר - ערך ה-ASCII שלו. למשל '0'=48. כל המספרים יושבים בטבלת ה-ASCII ברצף, מה שאמור לעזור לך למדי. פעולת חיבור למשל, היא פעולה די קלה - מתחילים מהמספר הנמוך (שמאלי ביותר) ומחברים אותו למספר הנמוך ביותר של המספר השני. אם יש שארית זוכרים אותה במשתנה Cary ומחברים אותו (יחד עם איפוס כמובן) לפעולת החיבור הבאה. הדבר היחיד שחשוב לזכור הוא שפעולת החיבור צריכה להראות כך:
strOutCome[k-i] = ((strOp1[n-i]-'0')+(strOp2[m-i]-'0')+iCarry)%10; // Mod 10 since it's a single digit! iCarry=((strOp1-'0')+(strOp2-'0')+iCarry)/10;​
מה שקורה פה הוא דבר כזה: m - אורך המספר הראשון n - אורך המספר השני K - האורך המצופה של התוצאה (הגדול מבין m,n בתוספת של 1 כי תיתכן גלישה) מהאורך מחסירים את i שזה אינדקס של לולאת FOR, אנחנו רצים על המספר מימין לשמאל... מה שאנו צריכים זה את ספרת היחידות, לכן מהחישוב לוקחים את שארית החלוקה ב-10. מה שאנו מעבירים זה את ספרת העשרות - תוצאת החלוקה ב-10. חיסור עובד בצורה דומה, אבל צריך לבדוק אם מתקבל מספר שלילי ואז להשאיל מהספרות הבאות... כפל הוא מספר פעולות חיבור...
 

asi123456789

New member
קודם כל תודה רבה

על התשובה המפורטת. דבר שני, אני לא בטוח שזה יעבוד strOutCome[k-i] = ((strOp1[n-i]-'0')+(strOp2[m-i]-'0')+iCarry)%10; תקן אותי אם אני טועה אבל הfor רץ מ0 עד למספר המחרוזת הגדול ביותר ולכן נגיע למצב שאם למשל m>n אז כשנעשה באיזה שלב n-i נגיע למספר שלילי, צריך לבדוק את העניין הזה. בכל מקרה תודה על התשובה אחי.
 

immortalus

New member
אל תשכח שצריך לאפס....

1= 000000000000001 X+0=X ולכן לא באמת חשוב מי מהם ארוך יותר ומי יותר קצר....
 

asi123456789

New member
למישהו יש אולי רעיון איך לעשות את החיסור??

די ניתקעתי עם זה. יש כמה מקרים וצריך לראות מה יותר גדול וכאלה... תודה מראש.
 

immortalus

New member
קצת תלוי מימוש...

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