(转)找符合条件的整数
2015-05-15 16:43
155 查看
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.
解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。
简单证明:因为
View Code
学习之处:
进行问题的转换 N*M的是十进制的表现形式里只有0和1更加,有特征,所以转换成查找N*M,进而反推M,减少问题查找的空间
相比方法四,方法三只是进行了剪枝的操作,思路是一样的。
扩展数字的话,像扩展一棵树的问题,便可以用队列方法继续表示了。
解决这个问题首先考虑对于任意的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,减少问题查找的空间
相比方法四,方法三只是进行了剪枝的操作,思路是一样的。
扩展数字的话,像扩展一棵树的问题,便可以用队列方法继续表示了。
相关文章推荐
- 编程之美——2.8 找符合条件的整数
- 编程之美 找出符合条件的整数
- 给出一个整数,寻找符合条件的幸运数的个数
- 【编程之美2.8】找符合条件的整数
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 重现开始战斗12-编程之美-找符合条件的整数
- 编程之美-2.8 找到符合条件的整数
- 找符合条件的整数
- 找到符合条件的整数
- 【C编程】找出符合以下条件的Troitsky数,将该数的首位数字移动到末位数字之后得到的数是原数的整数倍
- 编程之美2.8 | 找符合条件的整数
- 编程之美2.8找符合条件的整数
- 编程之美-找到符合条件的整数
- 编程之美-找符合条件的整数
- 找符合条件的整数
- 题目:请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。用c语言编写(不能用数字转换成字符串)。
- 编程之美--找个符合条件的整数
- 找到符合条件的整数
- 输入一个整数,如果该整数x符合条件:-1<x<10,则输出“ok”,否则输出“not ok”
- 试题答案_找符合条件的整数