高效素數篩法 北航複試上機題 C

2021-10-06 20:09:58 字數 1355 閱讀 5458

輸入乙個整數n(2<=n<=10000),要求輸出所有從1到這個整數之間(不包括1和這個整數)個位為1的素數,如果沒有則輸出-1。

輸入有多組資料。

每組一行,輸入n。

輸出所有從1到這個整數之間(不包括1和這個整數)個位為1的素數(素數之間用空格隔開,最後乙個素數後面沒有空格),如果沒有則輸出-1。

輸入100

輸出11 31 41 61 71

題目(見圖1)兩點要求:1.篩出素數 2.個位為1

素數(質數)的定義很簡單,如果乙個數只能被1和它本身整除,就是素數。

如果暴力遍歷所有輸入,演算法複雜度為o(n*n),下面用的素數篩法複雜度則為o(nloglogn)

素數篩法核心思想:

從2開始,初始化所有輸入為(isprime=true),並將每個素數的倍數都標記為合數(isprime=false),篩出素數;小技巧是當前素數i的倍數標記從ii開始,而不是2i(已經在前面標記過),再次減少執行時間。

程式流程:

1.走一遍上述素數篩法,將篩出的素數存入vector中

2.對10求模,判斷所有素數中個位是否為1,按要求輸出

tips:為什麼選用vector儲存素數,而不是陣列?

陣列建立時需要明確大小,向量則相當於變長陣列,也可以通過下標來訪問元素,動態變化的特性使其規避了浪費記憶體或訪問越界的問題。只需掌握如何訪問即可

#include

#include

#include

#include

using

namespace std;

const

int max=

10001;

vector<

int> prime;

//儲存陣列

bool isprime[max]

;//true為素數

void

initial()

isprime[0]

=false

; isprime[1]

=false

;//0 1不是素數

for(

int i=

2;i) prime.

push_back

(i);

for(

int j=i*i;j}return;}

intmain()

if(count==0)

cout<<

"-1"

cout

}

北航上機複試13真題

給出乙個標準輸入的正數 開頭末尾沒有多餘的0 輸出其科學計數法表示結果。比如 輸入0.000002,輸出2e 6 輸入123.456,輸出1.23456e2 輸入123456,輸出1.23456e2 解題 首先將其放入到char陣列中,找到loc即為小數點所在位數,和first 即為第一位非零數的位...

北航複試上機14年真題

第一題,階乘數。輸入乙個正整數,輸出時,先輸出這個數本身,跟著乙個逗號,再輸出這個數的各位數字的階乘和,等號,階乘和的計算結果,並判斷階乘和是否等於原數,如果相等輸出yes,否則輸出no。題目說明輸入的正整數以及其各位階乘和都不會超出int型的表示範圍。輸入樣例1 輸出樣例1 145,1 4 5 1...

2023年北航計算機複試上機題

當前程式設計題 求孿生數 1.問題描述 孿生數定義 如果a的約數 因數,包含1,但不包含a本身 之和等於b,b的約數 因數 之和等於a,a和b稱為孿生數 a和b不相等 試找出正整數m和n之間的孿生數。輸入形式 從控制台輸入兩個正整數m和n 1 m 輸出形式 在標準輸出上輸出符合題目描述的m和n之間的...