數值處理題庫 Sprime

2021-07-30 23:44:36 字數 1824 閱讀 3005

下面是這題題目

8、超級素數(sprime)

問題描述:

農夫john總能提供最好的牛排,你可以從上面的編號看出來:每去掉一根,總能保證剩下的數為質數,例如:

371->37->3

這是乙個長為3的超級素數。

輸入n(10<=n<=108),程式設計求出所有小於等於n的超級素數。

輸入格式:

只有乙個數為n,10<=n<=108

輸出格式:

輸出所有小於等於n的超級素數,相鄰兩個超級素數用乙個空格隔開(從小到大輸出)。

資料規模:

30%n<=105

50%    n<=107

100%   n<=108                             

分析:先看這題,這題是求在n以內有多少個超級素數,超級素數,就是每除以十,總能保證剩下的數為質數(當然他自己本身應當屬素數),因此首先想到的做法是(1不是素數)從2開始列舉到n,定義乙個函式來判斷這個數是不是素數,然後除以十,繼續判斷,一直到它小於零,知道這個數是超級素數就輸出。

但這方法顯然不行,一看就會超時,可能連50分都拿不到。於是就必須向另一種方法。

做法二:可先定義乙個陣列a,做個素數表,先對陣列a賦初值,再從2開始列舉求到n的素數表,然後再i循壞找出如果a[i]不等於0,證明這個數是個素數,再定義乙個bool函式判斷這個數是不是素數,這時只需要i除以十在判斷a[i]是否大於0,如果a【i】==0;就return false,否則跳出循壞後return true;這樣省去了很多判斷素數的時間。

最後只需要輸出這個a【i】就行了。

但這方法也會超時,記得當時用了c的輸入輸出也才勉強卡對了70分。

這時,我們可知,暴力列舉肯定不行,拒絕暴力。

那麼,就只能用最後一招了,找素數特點,再根據素數特點決定做法。

素數的特點:

1:除1和它本身沒有其他因數。

2:(除2)素數不是二的倍數。

3:(除5)素數不是五的倍數。

綜上所述,我們可以得出以下結論:

(除2、5)素數的個位數不是2、4、6、8、5;

因此素數的個位數可能是1、3、7、9;

由上面結論,我們可想出這乙個方法求出n以內的超級素數。

方法三:

我們可以先定義兩個陣列a,b,陣列a用來儲存超級素數,陣列b用來儲存素數可能的個位數即1、3、7、9四個數,已知十以內的素數有2、3、5、7,把這四個素數先存進a陣列裡,設乙個c開始點為0,d開始點為3;while循壞用a【c】*10+for迴圈b【i】,定義乙個函式判斷是否是素數,是素數則把它存進a【d+1】裡,for迴圈結束後c++;while迴圈到c大於d或者a【d】大於n;最後輸出a陣列。

程式如下

#include

#include

using namespace std;

#include

long long n,a[1000000]=,b[5]=,c,d=3;

bool isprime(long long x)// 判斷素數

while(c<=d&&a[d]<=n)//執行條件:

int main()

}return 0;

c++;//a陣列下乙個

}for(int i=0;i<=d;i++)//輸出

if(a[i]<=n)

cout<}

計蒜客 難題題庫 122 數值交換

看下右邊的 就知道這是一道交換數值的題目了。確實,開始看起來,這道題目出得比較2。但是我相信你在學習c和c 的時候對指標 引用的了解總會有一些誤區的。右邊的 寫了5個小函式,目的是交換兩個數。麻煩你去主函式裡面,把不能交換的 注釋掉。比如說,你覺得swap3這個函式不能交換,那麼請你注釋掉這一行和他...

特徵處理 數值特徵處理

專案工作流程 標準化標籤,將標籤值統一轉換成range 標籤值個數 1 範圍內 簡單來說 labelencoder 是對不連續的數字或者文字進行編號 one hot的基本思想 將離散型特徵的每一種取值都看成一種狀態,若你的這一特徵中有n個不相同的取值,那麼我們就可以將該特徵抽象成n種不同的狀態,on...

MySQL數值處理函式

1 round 四捨五入函式 round 數值,引數 如果引數的值為正數,表示保留幾位小數,如果引數的值為 0,則只保留正數部分們如果引數的值為負數,表示對小數點前第幾位進行四捨五入。2 ceil 數值 向上取整 3 floor 數值 向下取整 4 mod 引數 1,引數 2 求出餘數 eg sel...