כותב |
|
אורחח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 01 February 2005 בשעה 21:34 | | IP רשוּם
|
|
|
|
שלום לכם! האתר מאוד יפה, העיצוב, והתוכן אך הלכתי לאיבוד בחלק של מתמטיקה - כללי
יש שם כל כך הרבה דברים אך לא מצאתי איך אני עושה חזקות בשפת C
ואיך אני עושה שורשים בשפת C אז בבקשה תעזרו לי....
בתודה
|
חזרה לתחילת העמוד |
|
|
ניר מנהל האתר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 3296
|
נשלח בתאריך: 02 February 2005 בשעה 01:22 | | IP רשוּם
|
|
|
|
אתה צריך להשתמש בפונקציות pow, sqrt שנמצאות בספריה math.h
מידע ופונקציות מתמטיות נוספות תמצא במסמך הבא, בעמוד 35: http://underwar.livedns.co.il/document-details.asp?id=8
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 02 February 2005 בשעה 23:07 | | IP רשוּם
|
|
|
|
או שתבנה פונקציה משלך זה לא כזה ביג דיל אחי :)
אתה עושה פונקציה של העלאה בחזקה ושורש זה חזקה של חצי :)
|
חזרה לתחילת העמוד |
|
|
ניר מנהל האתר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 3296
|
נשלח בתאריך: 02 February 2005 בשעה 23:46 | | IP רשוּם
|
|
|
|
SBD - סתם לאתגר - נסה לכתוב פונקציה יעילה לחזקה.
אחת שפשוט מכפילה שוב ושוב זה פשוט. יש משהו הרבה יותר יעיל. לוקח על עצמך אתגר?
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 03 February 2005 בשעה 06:58 | | IP רשוּם
|
|
|
|
מממ...את האמת אחי שלא חשבתי על דרך אחרת....
אני ינסה לחשוב על דרך אחרת...
__________________ ~ Nobody Is Perfect, I'm Nobody ~
פורומים
|
חזרה לתחילת העמוד |
|
|
RPG2kiLL משתמש חבר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 376
|
נשלח בתאריך: 04 February 2005 בשעה 00:20 | | IP רשוּם
|
|
|
|
מעבר לזה, שים לב למה שאמרת קודם: תבנה פונקציה משלך - אתה עושה פונקציה של העלאה בחזקה ושורש זה חזקה של חצי .
אם הדרך שחשבת עליה זו לולאה של מכפלות, אז שים לב ששברים לא יתנהגו כמו שאתה רוצה.
|
חזרה לתחילת העמוד |
|
|
ניר מנהל האתר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 3296
|
נשלח בתאריך: 04 February 2005 בשעה 00:22 | | IP רשוּם
|
|
|
|
רותם - גם עבור רק מספרים שלמים - יש דרך לעשות את זה יעיל בO(logn). נראה אם מישהו מצליח למצוא את זו
|
חזרה לתחילת העמוד |
|
|
RPG2kiLL משתמש חבר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 376
|
נשלח בתאריך: 04 February 2005 בשעה 00:33 | | IP רשוּם
|
|
|
|
מניח שלא צריכים להסתבך יותר מידיי, ופשוט להשתמש בחוקי חזקות.. ואם אתה מרשה לי גם להקצות זיכרון, אז בכלל אני יכול לעשות משהו יעיל בטירוף.
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 04 February 2005 בשעה 10:50 | | IP רשוּם
|
|
|
|
תכנותית מן הסתם אני לא יצ ליח להכין אבל אני אפילו לא חושב על דרך אחרת :(
וצודק לא חשבתי בנוגע לשורש...
__________________ ~ Nobody Is Perfect, I'm Nobody ~
פורומים
|
חזרה לתחילת העמוד |
|
|
RPG2kiLL משתמש חבר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 376
|
נשלח בתאריך: 04 February 2005 בשעה 11:30 | | IP רשוּם
|
|
|
|
טוב, אם אני לא אהרוס ל SBD, אז אני אכתוב בפירוט את הרעיון שלי.
הרעיון הוא להשתמש בחוק החיבור מחוקי החזקות: x^(w1+w2) = x^w1*x^w2
ולכן מה שחשבתי זה בעצם להכפיל את התוצאה הקודמת בעצמה, תוך כדי שאני שומר את התוצאה, ובעצם אני מקבל התקדמות בחזקות של 2, כלומר x^(2,4,8,16, ...) i עד שמגיעים לחזקה שתהיה שווה, או האחרונה שנכנסת לחזקה שאני מעוניין לחשב. במידה ורציתי לחשב חזקה שהיא מסדרת החזקות של 2, סיימתי, במידה ולא נותר לכפול את התוצאה בתוצאות ששמרתי החל מהחזקות הגבוהות לנמוכות, במידה והן נכנסות בהפרש של החזקה שאני מעוניין לחשב.
מניח שדוגמא תבהיר יותר את העניין: אם אני רוצה לחשב 3 בחזקת 12, אני אתחיל כך: 3*3 (שווה לשלוש בריבוע) 9*9 (שווה לשלוש ברביעית) 81*81 (שווה לשלוש בשמינית) וכאן אני אעצור מכיוון שלא יעזור לי לחשב שלוש בחזקת 16. עכשיו יש לי כמה שווה שלוש בשמינית, כאשר המטרה שלי להגיע לשלוש בחזקת 12, לכן בעצם אני צריך לחשב כמה זה שלוש בחזקת 4 ולכפול בתוצאה האחרונה (כי 12-8=4) ומכיוון ששמרתי כמה שלוש ברביעית שווה נשאר לי רק לשלוף את הנתון מהזיכרון וזהו.
זה הדבר הכי יעיל ולא מסורבל שהצלחתי לעשות.. קיימת דרך אחרת?
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 04 February 2005 בשעה 12:27 | | IP רשוּם
|
|
|
|
לא הבנתי ממש את הרעיון כאילו הבנתי בערך איך הוא אמור לעבוד אבל לא יודע לא התסדר לי עם הדוגמא....
בכל מקרה דרך נחמדה, את האמת לא הייתי חושב עליה....:|
__________________ ~ Nobody Is Perfect, I'm Nobody ~
פורומים
|
חזרה לתחילת העמוד |
|
|
RPG2kiLL משתמש חבר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 376
|
נשלח בתאריך: 04 February 2005 בשעה 14:06 | | IP רשוּם
|
|
|
|
הדוגמא באה להסביר את הרעיון, אם לא הבנת את הדוגמא אז זה לא אסון. הרעיון המרכזי היה בעצם להשתמש בחוק חזקות, בגדול זה מה שהיית אמור להבין, מכאן אתה יכולת לפתח את הרעיון לבד.
שים לב שגם כאן, לא ניתן להשתמש בשברים, כלומר זוהי פונקציה להעלאה בחזקה ולא לשורש.
כדי לחשב שורש יש אלגוריתם מתמטי טהור שאיתו אפשר לממש פונקציה לחישוב שורש ריבועי, אני לא זוכר בדיוק אותו אבל הוא רשום אצלי איפשהו, החישוב יוצא דומה לחישוב של שבר ארוך (חילוק בית).
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 04 February 2005 בשעה 14:56 | | IP רשוּם
|
|
|
|
אז משהו ידוע איך מורכבות הפונקציה של החזקה בספריה של ה-MATH ?
למה שם אם אני לא טועה אפשר לעשות בחזקת חצי....[אז מן הסתם זה לא לפי מה שאתה אמרת אחי....]
__________________ ~ Nobody Is Perfect, I'm Nobody ~
פורומים
|
חזרה לתחילת העמוד |
|
|
ניר מנהל האתר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 3296
|
נשלח בתאריך: 04 February 2005 בשעה 15:02 | | IP רשוּם
|
|
|
|
רותם: הנה פתרון שפועל בדרך שהצעת פחות או יותר. זו הדרך הכי יעילה שאני מכיר:
קוד:
long power(int a, int b)
{
if (b == 1) return a; if (b == 0) return 1;
if (b % 2 == 0) return power(a*a, b/2);
return a*power(a*a, b/2);
} |
|
|
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 04 February 2005 בשעה 15:17 | | IP רשוּם
|
|
|
|
זה עם רקורסיה לא? [קראיה לפוקנציה מתוכה?]
בכל מקרה עכשיו לא הבנתי בכלל מה עשית פה :(
אבל אני כבר יבין [אל תסביר...] נבדוק את זה על הנייר :)
__________________ ~ Nobody Is Perfect, I'm Nobody ~
פורומים
|
חזרה לתחילת העמוד |
|
|
ניר מנהל האתר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 3296
|
נשלח בתאריך: 04 February 2005 בשעה 15:22 | | IP רשוּם
|
|
|
|
אפשר לעשות את זה גם בלי.. רוצה בלי? סתם היה לי יותר נוח עם...
|
חזרה לתחילת העמוד |
|
|
SBD פורומיסט על
הצטרף / הצטרפה: 13 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 1194
|
נשלח בתאריך: 04 February 2005 בשעה 16:11 | | IP רשוּם
|
|
|
|
על הנייר יוצתר קל לנסות בלי אז אם תוכל להביא לפה בלי יהיה טוב :)
__________________ ~ Nobody Is Perfect, I'm Nobody ~
פורומים
|
חזרה לתחילת העמוד |
|
|
ניר מנהל האתר
הצטרף / הצטרפה: 12 January 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 3296
|
נשלח בתאריך: 05 February 2005 בשעה 03:01 | | IP רשוּם
|
|
|
|
טוב, אז זה מסובך יותר בלי רקורסיה. בטוח יש דרך, אבל לא מצאתי משהו מהיר וקל לכתוב :)
|
חזרה לתחילת העמוד |
|
|