לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #4  
ישן 04-09-2006, 23:33
צלמית המשתמש של ם_O
  משתמש זכר ם_O ם_O אינו מחובר  
 
חבר מתאריך: 15.08.06
הודעות: 465
טוב...חזרתי מסבתא...וכתבתי לך קוד, o(n*logn)
בתגובה להודעה מספר 1 שנכתבה על ידי אלכס123 שמתחילה ב "עזרה בקשר לאלגוריתם"

הפונקציה שרצית - IsThere
מקבלת מערך וגודל, משתמשת בפונקציה func בשביל
לקרוא לעצמה ~logn פעמים בריקורסיה ובכל הרצה לעבור a*n מעברים על איברים מתת-המערך הנוכחי (שמוגדר ע"י low, high, mid).
בקיצור a*n*logn פעולות.
תחזיר 1 אם קיים איבר בarr שמופיע פעמיים או יותר, אחרת 0.







קוד:
#include <stdio.h> #include <conio.h> int flag; int func(int arr[], int low, int high){ int mid,i,j,k; if(low<high) { mid=(low+high)/2; func(arr,low,mid); func(arr,mid+1,high); i=low; j=mid+1; k=i; int c[500]; while((i<=mid)&&(j<=high)) { if(arr[i]<arr[j]) { c[k]=arr[i]; k++; i++; } else if (arr[i]==arr[j]){ flag=1; k++; i++; }else{ c[k]=arr[j]; k++; j++; } } while(i<=mid) { c[k]=arr[i]; k++; i++; } while(j<=high) { c[k]=arr[j]; k++; j++; } for(i=low;i<k;i++) { arr[i]=c[i]; } } return flag; } int IsThere(int arr[], int size){ flag = 0; return func(arr,0,size-1); } int main(){ int arr[] = {411, 41, 11, 33,19, 3, 1,50, 111, 4}; printf("%d",IsThere(arr,10)); getch(); }




_____________________________________
Any sufficiently advanced bug is indistinguishable from a feature

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 07-09-2006, 23:29
צלמית המשתמש של ם_O
  משתמש זכר ם_O ם_O אינו מחובר  
 
חבר מתאריך: 15.08.06
הודעות: 465
כמה דברים :)
בתגובה להודעה מספר 7 שנכתבה על ידי אלכס123 שמתחילה ב "אהה אני לא טבוח שאתה יודע..."

1.במקרה הזה אתה לא צריך לקבל את he, בגלל שאתה לא צריך לחזור לרמת קינון ריקורסיה קודמת כלשהי, אז אתה לא צריך את מנגנון הריקורסיה עבורו.
לכן, במקום לקבל אותו כארגיומנט של first, אתה יכול להגדיר אותו כמשתנה גלובלי, ואיפה שאתה קורא ל
First(num, he+1) פשוט לעשות
he:=he+1;
First(num);
עכשיו איפה מתעוררת הבעיה? בערך הראשוני ש he יקבל. שהרי אם תציב בו ערך בפונקציה, הוא יקבל את זה בכל פעם שהיא קוראת לעצמה.
אז יש לך 2 אפשרויות:
א.בבלוק הראשי, לקבוע ש he:=2;.
ב.להשתמש במשתנה בתור דגל/מונה ואז לכתוב בתוך first , בהתחלה, תנאי שרק אם flag=0 נניח אזי he:=2;.


2.שכחתי נקודה פסיק בend האחרון.

3.יכולת במקום לבדוק עם החלוקה שווה לעיגול למטה של החלוקה, לעשות if num mod he = 0 :/ (ואז איפה שאתה כותב if he = trunc(num/he) שזה, בשביל שהפונקציה תרוץ עד העיגול של שורש(num), להשתמש באותה צורה..)
_____________________________________
Any sufficiently advanced bug is indistinguishable from a feature

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 08-09-2006, 09:16
צלמית המשתמש של ם_O
  משתמש זכר ם_O ם_O אינו מחובר  
 
חבר מתאריך: 15.08.06
הודעות: 465
טוב במיוחד בשבילך הורדתי מהדר של פסקל כדי לבדוק...
בתגובה להודעה מספר 10 שנכתבה על ידי ם_O שמתחילה ב "אתה טועה"

(אני לא נוגע בפסקל בד"כ)
...זה עובד, ומצאתי טעות קטנה בתכנית שלך.
הנה התכנית ללא שימוש בארגיומנט נוסף מאשר num:
קוד:
var he,n:integer; function prime(num:integer):integer; begin n:=sqrt(num); if (he = trunc(n)) then begin prime:=1; exit; end else if (num mod he = 0 ) then begin prime:=0; exit; end else begin he:=he+1; prime:=prime(num); end; end;

הטעות שלך היא, שקודם כל ברור שאם
x=y/x אז x=שורש(y)
,אבל אתה משתמש בזה לא נכון (זה יעבוד ברוב המקרים, אבל נסה לדוגמא לתת לפונקציה את הערך 47...סתם לדוגמא. הסבר למה זה לא עובד לדוגמא במקרה הזה להלן)
עכשיו he מקבל ערכים שלמים. נניח שhe מגיע לשלם הגדול ביותר שיותר קטן משורש(num), אז אתה מניח שעיגול_למטה(שורש(num)) = עיגול_למטה(num/he) , אבל זה לא נכון בכל המקרים כי he הוא לא מספר שעבורו he=num/he אלא רק שווה לעיגול של num/he. כלומר אם החלק הלא-שלם של שורש(num) גדול מ0.5, זה לא לא יקיים לעולם את התנאי הראשון, ויגיע בסופו של דבר לתנאי השני (כש he=num) ויחזיר 0 למרות שNum ראשוני. מקרה כזה לדוגמא, הוא Num=47.
_____________________________________
Any sufficiently advanced bug is indistinguishable from a feature


נערך לאחרונה ע"י ם_O בתאריך 08-09-2006 בשעה 09:19.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 10:01

הדף נוצר ב 0.05 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר