背景:开始看到数最多不超过100位,明显要大数做法,想不到方法,结果发现最大也不超过Long long 就直接bfs了。
思路:第一个数是1,直接在后面加1或0,变成10或11,再加1或0变成100或101或110或111......这样就变成了两个方向的bfs,显然如果知道最大位数dfs也是可行的。但是效率不高。
我的代码:
#include<map> #include<set> #include<stack> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define M 209 #define INF 100000000 #define LL long long int using namespace std; LL str[M],n; void bfs(void){ LL x=1; queue<LL> q; while(!q.empty()) q.pop(); q.push(x); while(true){ x=q.front(); q.pop(); if(x%n == 0){ printf(",%I64d",x); return; } x*=10; //后面加0 q.push(x); <span id="transmark"></span> x+=1; //后面加1 q.push(x); } } int main(void){ while(scanf("%I64d",&n),n){ n=i; bfs(); } return 0; }
原文:http://blog.csdn.net/jibancanyang/article/details/44499217