1. 程式人生 > >1013 數素數 ——C/C++實現

1013 數素數 ——C/C++實現

題目

1013 數素數 (20 point(s))

令 P​i​​ 表示第 i 個素數。現任給兩個正整數 M≤N≤10​4​​,請輸出 P​M​​ 到 P​N​​ 的所有素數。

輸入格式:

輸入在一行中給出 M 和 N,其間以空格分隔。

輸出格式:

輸出從 P​M​​ 到 P​N​​ 的所有素數,每 10 個數字佔 1 行,其間以空格分隔,但行末不得有多餘空格。

輸入樣例:

5 27

輸出樣例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

演算法

演算法的思路是這樣的,對得到的素數進行計數,一直計算到第N個為止,從M個開始輸出。演算法難度不大。但是始終有一個測試點4通過不了,暫時還未能解決!

程式碼

C++

#include <iostream>
#include <cmath>
using namespace std;

int main(){
	int M,N,cnt=0,k=0,j,flag=0;	cin>>M>>N;
	for(int i=2;i<=100000;i++){
		for(j=2;j<=sqrt(i);j++){
			if(i%j==0)	break;	//i 不是素數 
		}
		if(j>sqrt(i)){	//i 是素數 
			cnt++;
			if(cnt>=M&&cnt<N){
				k++;
				printf("%d%c",i,k%10==0?'\n':' ');
			}
			if(cnt==N){
				cout<<i;
				flag=1;
			}	
		}
		if(flag==1)	break;
	}
	return 0;
} 

C

//PAT1013V1
#include <stdio.h>
#include <math.h>

int main(){
	int m,n,i,j,k=0;
	scanf("%d %d",&m,&n);
	int a[10000]={0};                                                                                                         
	for(i=2;i<10000;i++){
		for(j=2;j<=sqrt(i);j++){
			if(i%j==0)	//not prime
			break;
		}
		if(j>sqrt(i)){
			//prime
			a[k++]=i;    
		//	printf("%d",i);
		}	
	}
	for(i=m-1;i<n;i++){
		printf("%d%c",a[i],((i-m+2)%10==0)||(i==n-1)?'\n':' ');
		//if(j=0;j<10;j++)
				
	}
	return 0;
}