שאלה\בעיה ב-C

Evil Guy

New member
שאלה\בעיה ב-C

אהלן,
קיבלנו תרגיל שחלק ממנו זה לבנות תוכנית שמקבלת 2 מספרים,
ובודקת כמה מחלקים ראשוניים משותפים יש להם, עם חזרות.
כלומר:
מס' ראשוני - 2,3,5,7,11...
מחלק ראשוני:
20 - 2,2,5
40 - 2,2,2,5

כלומר, במקרה הזה, התוכנית תחזיר 3.

מותר להשתמש אך ורק בספריית stdio, לולאות ותנאי if.

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

#include <stdio.h>
int main(){
int min, max, i, j, k, l, m, count1, count2, count3, temp, divider;
scanf("%d",&min);
while (min!=0){
count1=0;
count2=0;
count3=0;
scanf("%d",&max);
for (divider=2; divider*divider<=min; divider++){
if (min % divider == 0)
break;

if (divider*divider >= min){ ///divider is a primal number///
temp = min;
while (temp >= divider){
if (temp % divider == 0){
count2=count2+1;
temp= temp/divider;
}
}
for (l=2; l<=count2; l++){
temp=max;
while (temp>=divider){
if (temp % divider == 0){
count3 = count3 + 1;
temp = temp/divider;
}
}
}
}
if (count3>count2)
count1=count1+count2;
else
count1=count1+count3;

}
printf("%d",count1);
scanf("%d",&min);
}
}

תודה מראש.
 
כמה הערות (מקריאה חטופה)

א. אתה יוצא מהלולאה כאשר min מתחלק ב-divider - נראה לי שהתכוונת להמשיך כאשר הוא לא מתחלק.
ב. לא הבנתי את הבדיקה שלך אם מספר הוא ראשוני.
ג. התנאי temp >= divider יכול בקלות לגרום ללולאה אינסופית.
ד. למה אתה בודק את המספר השני הרבה פעמים?
ה. אתה לא מאפס את count2 ואת count3 לפני כל בדיקת גורם.

לפני שאתה שואל איך הוא יכול להיות יותר טוב, כדאי לגרום לו לעבוד.
 

Evil Guy

New member
לא רשמתי שאני רוצה אותו יותר טוב, רשמתי שאני

רוצה אותו טוב... קרי, עובד...
 

Evil Guy

New member
עשיתי כמה שינויים,

(מיותר לציין שעדיין לא עובד) אשמח להכוונות...

#include <stdio.h>
int main(){
int min, max, i, j, k, l, m, count1, count2, count3, temp, divider;
scanf("%d",&min);
while (min!=0){
count1=0;
count2=0;
count3=0;
scanf("%d",&max);
divider=2;
for (i=2; i*i<=divider; i++){
if (divider % i == 0)
break;

if (i*i >= divider){ ///divider is a primal number///
temp = min;
while (temp >= divider){
if (temp % divider == 0){
count2=count2+1;
temp= temp/divider;
}
}
temp=max;
while (temp>=divider){
if (temp % divider == 0){
count3 = count3 + 1;
temp = temp/divider;
}
}
}
if (count3>count2)
count1=count1+count2;
else
count1=count1+count3;
count2=0;
count3=0;

}
printf("%d",count1);
scanf("%d",&min);
}
}
 

Evil Guy

New member
ועכשיו זה ממש קרוב...

אבל עדיין לא עובד :\

#include <stdio.h>
int main(){
int min, max, i, j, k, l, m, count1, count2, count3, temp, divider;
scanf("%d",&min);
while (min!=0){
count1=0;
count2=0;
count3=0;
scanf("%d",&max);
for (divider=2; divider*divider<=min; divider++){
for (i=2; i*i<=divider; i++)
if (divider%i == 0)
break;
if (i*i>divider){ //divider is now prime
count2=0;
count3=0;
temp=min;
while (temp>=divider){
if (temp%divider == 0){
count2=count2+1;
temp=temp/divider;
}
else
break;
}
temp=max;
while (temp>=divider){
if (temp%divider == 0){
count3=count3+1;
temp=temp/divider;
}
else
break;
}
if (count2>count3)
count1=count1+count3;
else
count1=count1+count2;
}
}
printf("%d",count1);
scanf("%d",&min);
}

}
 
כמעט נכון

יש הרבה סיבוכים מיותרים בקוד, אבל השגיאה (הלוגית) היחידה ששמתי לב אליה עכשיו היא שאתה בודק רק מספרים שהריבוע שלהם הוא עד min.
 

student2013

New member
אני תקוע בבעיה דומה

אני מכניס את שני המספרים אבל משום מה הוא תמיד אומר לי שהמחלק שווה אפס( גם כשאני מכניס 16 ו-8 אני מקבל שהתוצאה שווה אפס במקום 2), איך אני עושה שהוא ירשום לי את התוצאה הנכונה?
 
למה אתה אמור לקבל את המחלק?

באופן כללי, תתרגל לעבוד עם debugger - זה יחסוך לך המון בעיות.
 
למעלה