פורסם 2011 בדצמבר 1913 שנים שלום, בניתי פונקציה שמוצאת את כל המספרים הראשוניים עד המספר שאתה כותב לו (לפי הנפה של ארטוספן), אבל יש לי בעיה בשימוש בפונקציית free(); #include <stdio.h>#include <math.h>#include <stdlib.h>void main(){ int i,j=0; int *a; double s,prime; printf("Enter a prime number: "); flushall(); scanf("%lf",′); a=(int *)malloc((int) (prime-1)); for(i=1;i<prime;i++) a[i]=i; s=sqrt(prime); printf("The prime numbers till %.0f are: ",prime); for(i=2;i<s;i++) { for(j=2;j<prime;j++) if(j%i==0) a[j]=-1; } for(i=2;i<prime;i++) if(a[i]!=-1) printf("%d ",a[i]); printf("\n"); free(a);} השגיאה: כל פעם שאני מריץ את הפונקציה אני מקבל הודעת שגיאה בסופה: אם אני מוחק את השורה האחרונה של הfree() השגיאה המוזרה נעלמת.... תודה רבה לכל מי שיעזור!
פורסם 2011 בדצמבר 1913 שנים אתה משתמש לא נכון ב- malloc, תעבוד לפי התבנית הבאה:malloc( sizeof(int) * n )כאשר n הוא מס' ה- int-ים שאתה רוצה (אצלך זה 1)כמו כן, שים לב שקיימת מגבלה על הגודל המקסימלי ש- int יכול להכיל.. מס' ראשוניים נוטים לגדול מהר.
פורסם 2011 בדצמבר 1913 שנים מחבר אתה משתמש לא נכון ב- malloc, תעבוד לפי התבנית הבאה:malloc( sizeof(int) * n )כאשר n הוא מס' ה- int-ים שאתה רוצה (אצלך זה 1)כמו כן, שים לב שקיימת מגבלה על הגודל המקסימלי ש- int יכול להכיל.. מס' ראשוניים נוטים לגדול מהר.ניסיתי את זה קודם (לפני ששיניתי למה שזה עכשיו)... אבל זה עדיין לא עובד. הינה השורה:a=(int *)malloc(((int) (prime-1))*sizeof(int));
פורסם 2011 בדצמבר 1913 שנים בהקצאה תשנה לשורה: a=(int *)malloc(((int) (prime))*sizeof(int));כי אם אתה מקצה prime-1 מקומות כלומר האיבר האחרון במערך הוא prime-2 ובהמשך התוכנית אתה פונה לאיבר ה-prime -1 שלא קיים.(תוכל פשוט לא לפנות אליו ולוותר על הקצאת איבר נוסף אם אתה מניח שהמספר prime שאתה מקבל ראשוני, למרות שזה לא חובה, לא ממש משנה)שים לב שהאלגוריתם מחסיר חלק מהאיברים הראשוניים הראשונים.חוץ מזה האלגוריתם לא ממש יעיל.בלולאה יש להתחיל מ j=i ולא j=2. כי אם j<i אז j%i !=0 ממילא.חוץ מזה, יש פתרון יעיל יותר. תכניס את 2 לאיבר הראשון במערך.כעת עבור כל איבר החל מ-3 תבדוק אם הוא מתחלק באחד המספרים שקיימים במערך(מספרים ראשוניים) ותפסיק לבדוק כשהגעת למספר שגדול משורש המספר שקיבלת. אם הפסקת לבדוק, המספר ראשוני לכן תכניס אותו למערך במקום הבא.לשם הדוגמה: לקחתי את המספר 10000000.(מספר די גדול) חישבתי בעזרת האלגוריתם שלך את כל המספרים הראשוניים שקטנים ממנו וזה לקח 2:48 דקות.(אחרי התיקון 2:46 לא כזה הבדל..)חישבתי את אותו דבר בעזרת האלגוריתם שהצעתי וזה לקח 31 שניות.
פורסם 2011 בדצמבר 2013 שנים מחבר בהקצאה תשנה לשורה: a=(int *)malloc(((int) (prime))*sizeof(int));כי אם אתה מקצה prime-1 מקומות כלומר האיבר האחרון במערך הוא prime-2 ובהמשך התוכנית אתה פונה לאיבר ה-prime -1 שלא קיים.(תוכל פשוט לא לפנות אליו ולוותר על הקצאת איבר נוסף אם אתה מניח שהמספר prime שאתה מקבל ראשוני, למרות שזה לא חובה, לא ממש משנה)שים לב שהאלגוריתם מחסיר חלק מהאיברים הראשוניים הראשונים.חוץ מזה האלגוריתם לא ממש יעיל.בלולאה יש להתחיל מ j=i ולא j=2. כי אם j<i אז j%i !=0 ממילא.חוץ מזה, יש פתרון יעיל יותר. תכניס את 2 לאיבר הראשון במערך.כעת עבור כל איבר החל מ-3 תבדוק אם הוא מתחלק באחד המספרים שקיימים במערך(מספרים ראשוניים) ותפסיק לבדוק כשהגעת למספר שגדול משורש המספר שקיבלת. אם הפסקת לבדוק, המספר ראשוני לכן תכניס אותו למערך במקום הבא.לשם הדוגמה: לקחתי את המספר 10000000.(מספר די גדול) חישבתי בעזרת האלגוריתם שלך את כל המספרים הראשוניים שקטנים ממנו וזה לקח 2:48 דקות.(אחרי התיקון 2:46 לא כזה הבדל..)חישבתי את אותו דבר בעזרת האלגוריתם שהצעתי וזה לקח 31 שניות.ניסיתי לעשות את מה שאמרת אבל לא הצלחתי...אתה יכול לפרסם פה את התוכנית שיצרת?
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.