使用break語句輸出1到n中所有的素數
阿新 • • 發佈:2018-12-29
程式碼原型來源於上一篇部落格
第一次:
想法:第一個for迴圈是限制小於n的正整數。對於第二個for迴圈,除數從2累加,如果發現有整除,利用break語句退出迴圈;如果一直沒有退出迴圈,當i超過根號iP是仍然不整除,則說明是素數,於是就輸出iP。程式碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/* 找出1到n內所有素數.c */
/* written by Chen Gengru */
/* updated on 2018-11-2 */
int main()
{
int iP, iN, i;
float fSqN;
printf("請輸入n\n");
scanf("%d", &iN);
for(iP = 2; iP <= iN; iP++)
{
fSqN = sqrt(iP);
for(i = 2; i <= fSqN+1; i++)
{
if (iP % i == 0)
{
break;
}
if (i == fSqN+1)
{
printf("%d\n", iP);
}
}
}
return 0;
}
結果:
一個數都沒有輸出。
反思:腦子裡一直想著輸入100的情況,其實犯的還是類似於上一個部落格中的錯誤,根號n不一定是整型,即使是,我們討論的是iP,而根號iP,即fSqN不一定是整型,更準確的說,若fSqN是整型,那麼它早就break了,不可能活到這一步。所以第26行中的if ( i == fSqN + 1)一定不成立,是不能實現篩選素數的。因此不會輸出任何結果,哪怕一個數字。
更正:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/* 找出1到n內所有素數.c */
/* written by Chen Gengru */
/* updated on 2018-11-2 */
int main()
{
int iP, iN, i;
float fSqN;
printf("請輸入n\n");
scanf("%d", &iN);
for(iP = 2; iP <= iN; iP++)
{
fSqN = sqrt(iP);
for (i = 2; i <= fSqN+1; i++)
{
if (iP % i == 0)
{
break;
}
if (i > fSqN)
{
printf("%d\n", iP);
}
}
}
return 0;
}
結果:
沒有2!!
原因:由於2<=sqrt(2)+1,因此2得到了除以2的機會,餘數為0。fSqN+1放大了範圍,於是縮小範圍:fSqN+0.5
再次更正:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/* 找出1到n內所有素數.c */
/* written by Chen Gengru */
/* updated on 2018-11-2 */
int main()
{
int iP, iN, i;
float fSqN;
printf("請輸入n\n");
scanf("%d", &iN);
for(iP = 2; iP <= iN; iP++)
{
fSqN = sqrt(iP);
for(i = 1; i <= fSqN; i++)
{
if (iP % i == 0 && i != 1)
{
break;
}
if (i > fSqN-1)
{
printf("%d\n", iP);
}
}
}
return 0;
}
結果: