poj1426_模拟BFS
題意:給出一個200以內(nèi)的數(shù)n,求出這個數(shù)的倍數(shù)M,使得M中只有0和1組成。M最多100位。
分析:這個題竟然用的是bfs的思想。不看討論真的想不出來。思路是這樣的:
1.最高位一定是1.curnum%n不為0時,說明curnum不符合要求。
2.判斷curnum*10%n和(curnum*10+1)%n是否為0,不為0的話,令curnum=curnum*10和curnum*10+1繼續(xù)做第二步。直到取余之后為0即可。
3.這樣就會遇到大數(shù)存儲的問題。可以這樣解決:
令 (curnum*10+1)%n=a,求((curnum*10+1)*10+1)%m.
由定理
(a*b)%n = (a%n *b%n)%n
(a+b)%n = (a%n +b%n)%n
得((curnum*10+1)*10+1)%m=(a*10+1)%m.前一步操作得到的余數(shù)可以代替當(dāng)前步的k值。
這樣存儲一個mod[]即可。
4.最后輸出結(jié)果。比如求6的倍數(shù)。
用數(shù)組mod[]存儲余數(shù),其中mod[0]不使用,由mod[1]開始
那么mod中的余數(shù)依次為: 1 4 5 4 5 2 3 4 5 2 3 2 3 0? 共14個
令i=14,通過觀察發(fā)現(xiàn),i%2恰好就是 6 的倍數(shù)的最低位數(shù)字
i/2? 再令 i%2 ,恰好就是 6 的倍數(shù)的 次低位數(shù)字。。。
循環(huán)這個操作,直到i=0,就能得到 6的 01倍數(shù)(一個01隊列),倒序輸出就是所求
這樣就完成了 *10操作到 %2操作的過渡。
代碼
View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=524286; //這個數(shù)字是找的網(wǎng)上的。 7 int mod[maxnum]; 8 9 void digui(int m) 10 { 11 if(m==0) return ; 12 digui(m/2); 13 printf("%d",m%2); 14 } 15 16 int main() 17 { 18 int m,cnt; 19 while(scanf("%d",&m)!=EOF) 20 { 21 if(m==0) break; 22 memset(mod,0,sizeof(mod)); 23 cnt=1; 24 mod[cnt]=1; 25 cnt++; 26 while(1) 27 { 28 mod[cnt]=mod[cnt/2]*10%m; //模擬bfs 29 if(mod[cnt]==0) break; 30 cnt++; 31 mod[cnt]=(mod[cnt/2]*10+1)%m; 32 if(mod[cnt]==0) break; 33 cnt++; 34 } 35 digui(cnt); //遞歸比較費時間。 36 printf("\n"); 37 } 38 return 0; 39 }轉(zhuǎn)載于:https://www.cnblogs.com/pushing-my-way/archive/2012/07/30/2614541.html
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的poj1426_模拟BFS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统算法-Apriori
- 下一篇: Iveely搜索引擎二三题,用你的智慧来