בעיית c מוזרה...

Evil Guy

New member
בעיית c מוזרה...

התרגיל אומר לכתוב פונ' שמקבלת מספר, ומחזירה את כל הטורים ההנדסיים שסכומם המספר.
מה שכתבתי עובד אש. אש. אבל עד הערך 1251. מ-1252 נכנס ללולאה אינסופית..
אשמח להסבר...:


int power(int x, int y) /* function that calculates a power number */
{
int sum;
for (sum=1; y>0; y--)
sum*=x;
return sum;
}
int lg(int base, int x) /*function that finds the power number */
{
int counter=0, temp=1;
while (x>temp)
{
temp=temp*base;
counter++;
}
return counter;
}
void geometric()
{
int i=0,j,q=2,n=3,a1=5,num,sum;
int solution[3][10000];
for (j=0;j<10000; j++)
{
solution[0][j]=0;
solution[1][j]=0;
solution[2][j]=0;
}
/* first, get the num for the sum of the serie */
num=get_int();
/*now, find a1 and a sutiable q and n from a1=1, q=2*/
for (q=2; q<num; q++)
for (a1=1; a1<=num/(q+1); a1++)
{

n=lg(q,(int)num/a1*(q-1)+1);
if (n>num/2) break;
sum=(int)((a1*(power(q,n)-1)/(q-1)));
if (num==sum)
{
printf("G");
solution[0]=n; /* the output is this array */
solution[1]=a1; /* which contains in each */
solution[2]=q; /* column n, a1 and q for */
i++; /* the sum */
}
}
for (j=0; solution[0][j]!=0; j++)
printf("a1=%d q=%d n=%d\n",solution[1][j],solution[2][j],solution[0][j]);
}
 
אולי אתה חורג מהגודל של int ? באיזה קומפיילר אתה עובד?

בתוצאת הביניים של החישוב
a1*(power(q,n)-1)

מה הערכים של a1,q,n שאתה מגיע אליהם? לכמה מגיעה התוצאה הזו לפני שאתה מחלק ב q-1 ?
 

nocgod

New member
תעשה long במקום int

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

nocgod

New member
בזה מה?

בlong? מה הבעיה עם long? זה טיפוס בסיסי בשפת C/C++ בדיוק כמו short int, int, long int, float, double,char...
אני מניח שאם אסור לך להשתמש ב long אז הפיתרון שהבאת מספיק...
לצורך העניין ברוב המחשבים חישוב פיבונאצ'י 72 הוא החישוב המדוייק האחרון, כל השאר אחריו ישאו שגיאות...לרוב זה מספיק בשיעורי ++C או C בסיסיים.
כדי לעשות משהו יותר מגניב תצטרך לעשות ספרייה שתדע לעשות חישובים מתמטיים על ייצוגים של מספרים בתור מחרוזות דינאמיות, וכמובן שיהיו סגורות תחת הפעולות הבסיסיות, כלומר יחזירו string או char* בחזרה...אבל יש לי הרגשה אני off point...
 

Evil Guy

New member
עדכון חשוב:

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

void geometric()
{
int i=0,j,q=2,n=0,a1=0,num,sum, temp;
int solution[3][10000];
for (j=0;j<10000; j++)
{
solution[0][j]=0;
solution[1][j]=0;
solution[2][j]=0;
}
/* first, get the num for the sum of the serie */
num=get_int();
/*now, find a1 and a sutiable q and n from a1=1, q=2*/
for (n=2; n<(num/3); n++)
for (q=2; q<num; q++)
for (a1=1; a1<=num/(q+1); a1++)
{
sum=0;
for (j=0; j<n; j++)
{
if (sum > num) break;
sum+=a1*power(q,j);
}

if (num==sum)
{
solution[0]=n; /* the output is this array */
solution[1]=a1; /* which contains in each */
solution[2]=q; /* column n, a1 and q for */
/*printf("a1=%d q=%d n=%d, %d\n",solution[1],solution[2],solution[0],i+1);*/
i++; /* the sum */
}
else if (sum>num) break;

}
for (j=0; solution[0][j]!=0; j++)
printf("a1=%d q=%d n=%d, %d\n",solution[1][j],solution[2][j],solution[0][j], j+1);
}
 
למעלה