您的位置:首页 > 其它

(转)找符合条件的整数

2015-05-15 16:43 155 查看
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.
解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。
简单证明:因为

// 解法四:将搜索空间分过类的广度搜索,这样空间占用是O(N)而不是
// 指数级。分类的原则是按照模N的余数分类 
#define _CRT_SECURE_NO_WARNINGS 1

#include <cstdio>
#include <bitset>
#include <vector>
#include <queue>
using namespace std;

struct QNode {
int v, r; // v is value, r is remainder
QNode(int vv, int rr): v(vv), r(rr) {}
QNode(): v(0), r(0) {}
};

int main() {
int N;
while(scanf("%d", &N) != EOF) {
//bitset<N> bn;
queue<QNode> q;
q.push(QNode(1, 1));
while(!q.empty()) {
//bn.reset();
vector<bool> bn(N, false);
int s = q.size();
while(s--) {
QNode t = q.front();
if(t.r == 0) {
printf("n = %d, m = %d, n*m = %d/n", N, t.v/N, t.v);
goto ok;
}
q.pop();
if(!bn[t.r * 10 % N]) {
bn[t.r * 10 % N] = true;
q.push(QNode(t.v * 10, t.r * 10 % N));
}
if(!bn[(t.r * 10 + 1) % N]) {
bn[(t.r * 10 + 1) % N] = true;
q.push(QNode(t.v * 10 + 1, (t.r * 10 + 1) % N));
}
}
}
ok:;
}
return 0;
}


View Code
学习之处:

进行问题的转换 N*M的是十进制的表现形式里只有0和1更加,有特征,所以转换成查找N*M,进而反推M,减少问题查找的空间

相比方法四,方法三只是进行了剪枝的操作,思路是一样的。

扩展数字的话,像扩展一棵树的问题,便可以用队列方法继续表示了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: