نوشته شده توسط
dele514
سلام.
اول اینکه اعداد اول از 2 شروع میشن.(خط 4 (a=
3))
دوم اینو هر چی زور زدم نقهمیدم(خط 6 , 7)
سوم اینو ببین فقط نخند چون شهادته.
int a,b;
bool c=false;
printf("\n adad aval");
printf("\n");
for(a=2;a<100;a++)
{
for(b=2;b<a;b++)
{
if (a%b==0)
{
c=true;
break;
}
else
c=false;
}
if(c==false)
printf(a);
}
سلام.
کد شما درست عمل میکنه ولی بلاک else ای که داخل حلقه هست نیازی نیست که اینهمه اجرا بشه. کافیه قبل از حلقه یکبار مقدار پیش فرض c رو تنظیم کنید. مثلا :
int a,b;
printf("\n adad aval");
printf("\n");
for(a=3;a<100;a++)
{
bool ift = true;
for(b=2;b<a;b++)
{
if (a%b == 0)
{
ift = false;
break;
};
};
if (ift) printf("%-5d",a);
};
و نکته ی دیگه اینکه لازم نیست که تمام اعداد قبل از یک عدد چک بشه تا بفهمیم اول هست یا نه. کافیه به اعداد اول قبل از خودش که کوچکتر و مساویه مجذور اون عدد باشن بخش پذیر نباشه. مثلا برای 25 کافیه که 2 و 3 و 5 رو تست کنیم. مثال :
#define COUNT 1000
int a,b;
bool ift;
int aval[COUNT];
int index = 1;
aval[0] = 2;
a = 2;
while (index < COUNT)
{
ift = true;
int majzoor = (int)sqrt((float)a);
for(b = 0; b < index; b++)
{
if (a % (aval[b]) == 0)
{
ift = false;
break;
};
if (aval[b] > majzoor) break;
};
if (ift) aval[index++] = a;
a++;
};
printf("\n adad aval");
printf("\n");
for (int i = 0; i < index; i++)
{
printf("%-10d", aval[i]);
};
با تنظیم مقدار COUNT میتونید تعداد اولین اعداد اولی که پیدا میکنیم رو مشخص کنیم. دقت کنید که COUNT تعداد اعداد اولمونه! نه محدوده ی اونها. مثلا برای اینکه اعداد اول زیر صد رو پیدا کنیم کافیه که مقدار COUNT رو 25 تنظیم کنیم.
من مقدار COUNT رو به 100000 تغییر دادم. بالافاصله بعد از اجرا همه رو حساب کرد و برای چاپش هم حدودا 5 ثانیه طول کشید. که آخرین عدد چاپ شده 1299709 بود. این روش به شدت سریع تر از روش قبلیه