今天寫了一道很有意思的演算法題,好久沒有寫過部落格啦,隨手記下來~
問題描述 :
有這樣一種素數叫純素數(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...