PAT1013數素數C++
PAT1013數素數
題目:
1013 數素數 (20分)
令 Pi 表示第 i 個素數。現任給兩個正整數 M≤N≤10000,請輸出 PM到 PN的所有素數。
輸入格式:
輸入在一行中給出 M 和 N,其間以空格分隔。
輸出格式:
輸出從 PM 到 PN 的所有素數,每 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
程式碼:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int M,N;
cin>>M>>N;
int a[10000]; //儲存素數值,陣列下標代表了是第幾個素數
int k=0,m=0;
int flag;
int i=2;
a[0]=2; //指明第一個素數
while(k<=N)
{
flag=0;
for(int j=2;j<=sqrt(double(i));j++) //1.sqrt()裡面是double型 的數,但i是int型的,要轉化一下
//2.若直接用j<i,第四個測試點會執行超時。
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
k++;
a[k]=i;
}
i++;
}
for(int i=M;i<N;i++)
{
cout<<a[i];
m++;
if(m%10==0) //設定輸出格式
cout<<endl;
else
cout<<' ';
}
cout<<a[N];
system("pause");
return 0;
}
注意:
- 最開始,我用的是一個for迴圈來限制值,這樣不好確定 i 的範圍。網上查了一下第10000個素數大概是10500左右,但這樣每次都要計算出10000個素數,不太方便。也可能會產生執行超時,第四個測試點通不過的問題。後來選用一個while迴圈,改善了一下。
for(int i=0;i<10500;i++)
{
} - 最開始在判斷一個數 i 是否為素數時,我採用的是用 i 除以 從2到i-1的所有數,看看餘數是否為0;這樣會導致執行超時,第四個測試點通不過,改善了一下,用 i 除以從2 到sqrt(i) 的所有數,這可能是這道題要考察的點,要學會適當優化程式。
相關文章
- 1013 數素數 (20分)/c++實現C++
- 簡單的素數問題(C++)C++
- PAT-B 1013 數素數 【素數】
- 素數
- 數論(1):素數
- 任意進位制下的可逆素數 C++C++
- PAT-B 1007 素數對猜想【素數】
- 素數篩
- 【數論】素數篩法
- 素數判斷
- 素數 UVA 406
- 最強素數
- 判斷素數
- 美素數 hd 4548
- 素數判定 hd 2012
- 計算素數【Java】Java
- 初等數論——素數,逆元,EXGCD有關GC
- [PAT B] 1013 數素數 -未完成
- 第六章 數學問題 ----------6.13 素數的篩法(第十萬零二個素數)
- 素數個數 <埃式篩 && 尤拉篩>
- 如何高效尋找素數
- 密碼工程-大素數密碼
- 【數學問題】判斷一個數是否是素數
- 求十個連續最小自然數,非素數。
- L1-028 判斷素數 分數 10
- 兩位數學家發現素數計數新方法,原來「p²+nq²」形式的素數真有無限多個
- 分拆素數和 hd 2098
- [PAT B] 1007 素數對猜想
- 素數判定(int sushu(int n))
- [演算法]: 素數篩法演算法
- 1354: 素數判定(C語言)C語言
- 【演算法】數學之旅,根據素數特徵尋找底數演算法特徵
- 輸出一個區間內的質數(素數)
- 判斷一個數是不是質數(素數),3種方式介紹
- 大數模擬 加減乘除 判斷大數是否為素數 板子
- 6-2 計算素數和
- 關於素數定理的證明
- c語言 構造素數表C語言