POJ 1426 Find The Multiple

举报
Linux猿 发表于 2021/08/04 23:16:32 2021/08/04
【摘要】 题目链接~~> 做题感悟:做了杭电上的两个题目,再做这个真是 so  easy !但是还要写一下的,用第二种方法很不熟练。。。 解题思路:还是用取余的思想,每次都将余数乘 10 再加 上相应的数,0 要特判一下。 代码1: #include<stdio.h>#include<iostream>#include<string...

题目链接~~>

做题感悟:做了杭电上的两个题目,再做这个真是 so  easy !但是还要写一下的,用第二种方法很不熟练。。。

解题思路:还是用取余的思想,每次都将余数乘 10 再加 上相应的数,0 要特判一下。

代码1:


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string>
  4. #include<string.h>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std ;
  8. int n ;
  9. bool vis[300] ; // 标记余数是否相同
  10. struct zhang
  11. {
  12. int x,num ;
  13. string str ; // 这个很好用
  14. } ;
  15. int bfs()
  16. {
  17. queue<zhang>q ;
  18. zhang curt,next ;
  19. memset(vis,false,sizeof(vis)) ;
  20. curt.x=0 ;
  21. curt.str="" ;
  22. curt.num=0 ;
  23. q.push(curt) ;
  24. while(!q.empty())
  25. {
  26. curt=q.front() ;
  27. q.pop() ;
  28. if(curt.num>100) continue ;
  29. for(int i=0 ;i<2 ;i++)
  30. {
  31. next=curt ;
  32. next.num+=1 ;
  33. next.x=next.x*10+i ;
  34. if(!next.x) continue ;
  35. if(next.x%n==0)
  36. {
  37. next.str+=(48+i) ;
  38. next.str+='\0' ;
  39. cout<<next.str<<endl ;
  40. return true ;
  41. }
  42. next.x=next.x%n ;
  43. if(vis[next.x]) continue ;
  44. vis[next.x]=true ;
  45. next.str+=(48+i) ;
  46. q.push(next) ;
  47. }
  48. }
  49. return false ;
  50. }
  51. int main()
  52. {
  53. while(scanf("%d",&n)!=EOF)
  54. {
  55. if(!n) break ;
  56. bfs() ;
  57. }
  58. return 0 ;
  59. }

代码2:


  
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #include<iostream>
  5. #define MX 5000
  6. using namespace std ;
  7. int n ;
  8. bool vis[300] ;
  9. struct zhang
  10. {
  11. int x,m,pre,num ;
  12. }q[MX];
  13. void print(int k) // 输出 不用string 存数
  14. {
  15. if(k==-1)
  16. return ;
  17. print(q[k].pre) ;
  18. printf("%d",q[k].x) ;
  19. }
  20. int bfs()
  21. {
  22. zhang curt,next ;
  23. int start=-1,head=0 ;
  24. memset(vis,false,sizeof(vis)) ;
  25. curt.x=1 ;
  26. curt.num=1 ;
  27. curt.pre=-1 ;
  28. if(n==1)
  29. {
  30. cout<<1<<endl ;
  31. return true ;
  32. }
  33. vis[1]=true ;
  34. curt.m=1 ;
  35. q[++start]=curt ;
  36. while(head<=start)
  37. {
  38. int h=head ;head++ ;
  39. curt=q[h] ;
  40. if(!curt.m)
  41. {
  42. print(h) ;
  43. printf("\n") ;
  44. return true ;
  45. }
  46. if(curt.num>100) continue ;
  47. for(int i=0 ;i<2 ;i++)
  48. {
  49. next=curt ;
  50. next.m=next.m*10+i ;
  51. if(!next.m) continue ;
  52. next.m=next.m%n ;
  53. if(vis[next.m]) continue ;
  54. vis[next.m]=true ;
  55. next.x=i ;
  56. next.num+=1 ;
  57. next.pre=h ;
  58. q[++start]=next ;
  59. }
  60. }
  61. return false ;
  62. }
  63. int main()
  64. {
  65. while(scanf("%d",&n)!=EOF)
  66. {
  67. if(!n) break ;
  68. bfs() ;
  69. }
  70. return 0 ;
  71. }

 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/17435837

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。