輸入乙個整數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之間的...