找到符合条件的整数

来源:互联网 发布:无间道是什么意思知乎 编辑:程序博客网 时间:2024/05/19 16:05

  问题:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.  

 解法一.一般正向思维


 解法二.逆向思维:已知结果求条件


代码实现如下:

// 初始化     for(i = 0; i < N; i++)          BigInt[i].clear();     BigInt[1].push_back(0);     int NoUpdate = 0;      for(i=1,j=10%N; ; i++,j=(j*10)%N)     {          bool flag = false;          if(BigInt[j].size() == 0)          {               flag = true;               // BigInt[j] = 10^i, (10^i % N = j)               BigInt[j].clear();               BigInt[j].push_back(i);          }          for(k = 1; k < N; k++)          {               if((BigInt[k].size() > 0)                    && (i > BigInt[k][BigInt[k].size() - 1])                     && (BigInt[(k + j) % N].size() == 0))               {                    // BigInt[(k + j) % N] = 10^i + BigInt[k]                    flag = true;                    BigInt[(k + j) % N] = BigInt[k];                    BigInt[(k + j) % N].push_back(i);               }          }          if(flag == false) NoUpdate++;       else NoUpdate=0;          // 如果经过一个循环节都没能对BigInt进行更新,就是无解,跳出。          // 或者BigInt[0] != NULL,已经找到解,也跳出。          if(NoUpdate == N || BigInt[0].size() > 0)               break;     }     if(BigInt[0].size() == 0)     {          // M not exist     }     else     {          // Find N * M = BigInt[0]     } 


0 0
原创粉丝点击