1. 程式人生 > >輸出1到n中所有的素數

輸出1到n中所有的素數

思路:判斷一個數n是否為素數,分別將2到[根號n](即根號n取整)作為除數,若都不整除,則n為素數。
第一次程式碼:

#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, i, j;
	float fN, fSqN;
	
	printf("請輸入n\n");
	scanf("%f", &fN);
	
	for
(iP = 2; iP <= fN; iP++) { fSqN = sqrt(fN); for(i = 2, j=0; i <= fSqN ; i++) { if (iP % i == 0) { j++; } } if (j == 0) { printf("%d\n", iP); } } return 0; }

結果:
在這裡插入圖片描述
在這裡插入圖片描述
發現並不是想象中的結果,前幾個素數總是不能輸出。事實上,小於等於根號n取整的素數都無法輸出。
這是怎麼回事呢?原來,文章開頭所說的分別以2到根號n取整作為除數在這段程式碼裡應該解釋為:分別以2到根號iP取整,而並不是拿作為上限判斷的n來開根號作除數。
修改:

#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, j;
	float fSqN;
	
	printf("請輸入n\n");
	scanf("%d", &iN);
	
	for(iP = 2; iP <= iN; iP++)
	{
		fSqN = sqrt(iP);
		
		for(i =
2, j=0; i <= fSqN ; i++) { if (iP % i == 0) { j++; } } if (j == 0) { printf("%d\n", iP); } } return 0; }

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