1. 程式人生 > >使用break語句輸出1到n中所有的素數

使用break語句輸出1到n中所有的素數

程式碼原型來源於上一篇部落格
第一次:
想法:第一個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;
}

結果:
在這裡插入圖片描述