我素故我在 東華大學OJ練習題

2021-10-21 02:25:48 字數 1537 閱讀 5854

今天寫了一道很有意思的演算法題,好久沒有寫過部落格啦,隨手記下來~

問題描述 :

有這樣一種素數叫純素數(yy出來的名字),當它是乙個多位數的時候,你把它的末位去掉之後餘下的數依然是乙個素數。比如說2393,2393 本身是乙個素數,它的末位去掉之後,餘下的是239。239 是乙個素數,它的末位去掉之後,餘下的是23 。23是乙個素數,它的末位去掉之後,餘下的是2 。2依然還是乙個素數。純素數的長度叫做「維」。2393 是乙個4維素數。3797也是乙個4維素數。

輸入說明 :

第一行先給出一共有多少組資料n(n<=1000),接下來有n組資料.

每組包括乙個整數t(1<=t<=8)。

輸出說明 :

按照從小到大的順序輸出所有的t維純素數。

輸入範例 :3

814輸出範例:

23399339

29399999

37337999

59393339

7393913323

572333

2339

2393

2399

2939

3119

3137

3733

3739

3793

3797

5939

7193

7331

7333

7393

這道題拿到手第乙個想法就是暴力解法,但是一想比如輸入t=8,那麼直接從10000000~99999999裡面找出來所有符合的質數,顯然這樣就太耗時了,注意到題目提醒深度優先搜尋,於是琢磨一下,寫了乙個廣度優先的思路。

我的思路是從個位開始,逐位判斷的方式。因為想要符合「純素數」的要求,那麼個位必然是素數。而1維素數只有2,3,5,7,那麼就達到了剪枝的目的。

把1維素數逐個入隊,然後開始迴圈,當佇列非空的時候,訪問隊頭,即先取出2,再找所有2開頭的的2維素數,依次入隊,23,29,訪問3,再找所有3開頭的2維素數。。。如是這樣就省去了很多時間啦。

上**

#pragma warning(disable:4996)

#include#includetypedef struct

queue;

int primenumber(int n);

int isemptyq(queue q);

int main()

}//佇列非空則迴圈

while (!isemptyq(q))

for (i = 1; i <= 9; i++)}}

}n--;

}} }

return 0;

}int primenumber(int n)

} return 1;

}int isemptyq(queue q)

else

}

東華OJ高階題49 我素故我在

49 我素故我在 問題描述 有這樣一種素數叫純素數 yy出來的名字 當它是乙個多位數的時候,你把它的末位去掉之後餘下的數依然是乙個素數。比如說2393,2393 本身是乙個素數,它的末位去掉之後,餘下的是239。239 是乙個素數,它的末位去掉之後,餘下的是23 23是乙個素數,它的末位去掉之後,餘...

我素故我在

有這樣一種素數叫純素數 yy出來的名字 當它是乙個多位數的時候,你把它的末位去掉之後餘下的數依然是乙個素數。比如說2393,2393 本身是乙個素數,它的末位去掉之後,餘下的是239。239 是乙個素數,它的末位去掉之後,餘下的是23 23是乙個素數,它的末位去掉之後,餘下的是2 2依然還是乙個素數...

C語言演算法 我素故我在

第一行先給出一共有多少組資料n n 1000 接下來有n組資料.每組包括乙個整數t 1 t 8 按照從小到大的順序輸出所有的t維純素數。381 423399339 29399999 37337999 59393339 7393913323 572333 2339 2393 2399 2939 311...