下面是這題題目
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...