Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349216
  • 博文数量: 63
  • 博客积分: 1412
  • 博客等级: 中尉
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 23:07
文章分类

全部博文(63)

文章存档

2012年(42)

2011年(21)

我的朋友

分类: C/C++

2012-03-22 20:20:07

今天看了《编程之美》上的2.8节---找符合条件的整数。
 
这道题的解法比较好,就是变换思路:将查找M,使得M*N这个数只含有0,1的问题转化为先找只含有0,1数字的X问题。
 
解法1:暴力求解。从1开始查找M,然后判断M*N=X这个数字是否只含有0,1.
 
解法2:因为X只含有0,1所以满足这个条件的X的个数会比满足条件的M少。利用BFS方法进行遍历。f(a*10),f(a*10+1)
具体代码如下:
 
解法3:是对解法2的优化。因为题目要求的是查找最小的数字X。所以余数的范围为0-(N-1)。并用数组存储余数为i的最小数字。即a[i]表示的是当位数为K位时,余数为i的最小数字。
这样的好处就是对BFS遍历进行剪枝。
具体代码如下:

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <queue>
  3. #include <set>

  4. using namespace std;

  5. struct _node
  6. {
  7.     int    value;
  8.     int    remainder;
  9. };

  10. int    main()
  11. {
  12.     int    N = 0;
  13.     set <int> res;
  14.     queue<struct _node> q;
  15.     struct _node node;
  16.     struct _node elem;
  17.     set<int>::iterator iter = NULL;
  18.     int r = 0;

  19.     //输入N
  20.     scanf( "%d", &N );

  21.     node.value = 1;
  22.     node.remainder = 1;
  23.     q.push( node );

  24.     int size = 0;
  25.     while( !q.empty() )
  26.     {
  27.         size = q.size();
  28.         res.clear();
  29.         while( size > 0 )
  30.         {
  31.             elem = q.front();
  32.             //printf( "[%d]value=%d,remainder=[%d]\n", __LINE__, elem.value, elem.remainder );
  33.             //printf( "size=[%d]\n", res.size() );

  34.             //判断该数字的余数是否能被N整除
  35.             if( elem.remainder == 0 )
  36.             {
  37.                 cout << elem.value << endl;
  38.                 return 0;
  39.             }
  40.             q.pop();

  41.             //以下为剪枝部分,得到第一个最小的余数为i的数字
  42.             //elem*10
  43.             int r = (elem.remainder * 10)%N;
  44.             iter = res.find(r);
  45.             if( iter == res.end() )
  46.             {
  47.                 res.insert(r);
  48.                 node.value = elem.value * 10;
  49.                 node.remainder = r;
  50.                 q.push( node );
  51.             }

  52.             //elem*10+1
  53.             r = (elem.remainder * 10 + 1)%N;
  54.             iter = res.find(r);
  55.             if( iter == res.end() )
  56.             {
  57.                 res.insert(r);
  58.                 node.value = elem.value * 10+1;
  59.                 node.remainder = r;
  60.                 q.push( node );
  61.             }
  62.             size--;
  63.         }
  64.     }
  65. }

阅读(2721) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~