POJ1426-Find The Multiple (BFS 余数)

素颜马尾好姑娘i 2022-09-20 12:50 150阅读 0赞

题意:给出一个整数n,(1 <= n <= 200)。求出任意一个它的倍数m,要求m必须只由十进制的’0’或’1’组成。

第一份代码,记录路径的BFS

第二份代码,忘记是从哪里看的了……

第三份代码,感觉这个思路很好:POJ1426-Find The Multiple - ζёСяêτ - 小優YoU

  1. #include <cstdio>
  2. #include <cstring>
  3. const int N=1000005;
  4. int n;
  5. int que[N],pre[N],q[N],ans[205];//que[] 0、1,q[]当前余数,pre[]前驱。
  6. int bfs ()
  7. {
  8. int head=0,tail=1,now,next,i;
  9. que[1]=1;pre[1]=0;q[1]=1;
  10. while (head<tail)
  11. {
  12. now=q[++head]*10;
  13. for (i=0;i<=1;i++)
  14. {
  15. next=now+i;
  16. tail++;
  17. que[tail]=i;
  18. q[tail]=next%n;
  19. pre[tail]=head;
  20. if (q[tail]==0)
  21. return tail;
  22. }
  23. }
  24. }
  25. int main ()
  26. {
  27. while (scanf("%d",&n),n)
  28. {
  29. int cnt=0,i=bfs();
  30. while (i)
  31. {
  32. ans[++cnt]=que[i];
  33. i=pre[i];
  34. }
  35. for (i=cnt;i>=1 ;i-- )
  36. printf("%d",ans[i]);
  37. printf("\n");
  38. }
  39. return 0;
  40. }
  41. #include <cstdio>
  42. #include <cstring>
  43. int n;
  44. __int64 now,q[1000000];
  45. void bfs ()
  46. {
  47. int head=0,tail=1,i;
  48. q[tail]=1;
  49. while (head<tail)
  50. {
  51. head++;
  52. now=q[head];
  53. now*=10;
  54. if (now%n==0)
  55. break;
  56. for (i=0;i<=1;i++)
  57. {
  58. tail++;
  59. q[tail]=now+=i;
  60. }
  61. }
  62. printf("%I64d\n",now);
  63. }
  64. int main ()
  65. {
  66. while (scanf("%d",&n),n)
  67. bfs();
  68. return 0;
  69. }
  70. //http://blog.csdn.net/lyy289065406/article/details/6647917
  71. #include <cstdio>
  72. #include <cstring>
  73. int mod[600000];
  74. int main ()
  75. {
  76. int n,i;
  77. while (scanf("%d",&n),n)
  78. {
  79. mod[1]=1; //初始化,n倍数的最高位必是1
  80. for (i=2;mod[i-1]!=0;i++) //利用同余模定理,从前一步的余数mod[i/2]得到下一步的余数mod[i]
  81. mod[i]=(mod[i/2]*10+i%2)%n;
  82. //mod[i/2]*10+i%2模拟了BFS的双入口搜索
  83. //当i为偶数时,+0,即取当前位数字为0 。为奇数时,则+1,即取当前位数字为1
  84. i--;
  85. int pm=0;
  86. while (i)
  87. {
  88. mod[pm++]=i%2; //把*10操作转化为%2操作,逆向求倍数的每一位数字
  89. i/=2;
  90. }
  91. while (pm)
  92. printf("%d",mod[--pm]);
  93. printf("\n");
  94. }
  95. return 0;
  96. }

发表评论

表情:
评论列表 (有 0 条评论,150人围观)

还没有评论,来说两句吧...

相关阅读