标签:iostream push size big tar 整数 ret get 两种
<题目链接>
题目大意:
给一个小于200的正整数n,问只有0和1组成的位数小于100的最小能被n整除的数是多少。
解题分析:
用DFS或者BFS沿着位数进行搜索,每一次搜索到下一位都有两种情况,0或者1,还要注意的是,大数取模的方法。但是我有一个疑问,这题位数最高为100,用dfs为什么不会超时?还是说只是此题数据太弱吗?
BFS解法
#include<iostream> #include<cstdio> #include<queue> #include<string> #include<algorithm> using namespace std; inline bool big_mod(string &s,int mod) //大数取模运算 { int ans=0; for( int i=0;i<s.size();i++) { ans=(ans*10+s[i]-‘0‘)%mod; } return ans==0; } string bfs(int n) { queue<string>q; q.push("1"); //首位一定为1 while(!q.empty()) { string top=q.front(); q.pop(); if(big_mod(top,n)) //如果该数能被n整除,则符合 { return top; } for(int i=0;i<2;i++) { string temp=top+char(‘0‘+i); if(big_mod(temp,n)) { return temp; } q.push(temp); } } } int main() { int n; while(~scanf("%d",&n)&&n) { cout<<bfs(n)<<endl; } return 0; }
DFS解法
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; bool flag; char s[110]; void dfs(int mod,int d,int n) { if(d>100) return ; if(mod==0) { flag=true; s[d]=0; return ; } if(!flag) { s[d]=‘0‘; dfs((mod*10)%n,d+1,n); } if(!flag){ s[d]=‘1‘; dfs((mod*10+1)%n,d+1,n); } } int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; memset(s,0,sizeof(0)); s[0]=‘1‘; //首位为1 flag=false; dfs(1,1,n); printf("%s\n",s); } return 0; }
2018-08-28
POJ 1426 Find The Multiple(大数取模)【DFS】||【BFS】
标签:iostream push size big tar 整数 ret get 两种
原文地址:https://www.cnblogs.com/00isok/p/9551466.html