【问题标题】:generate unique 5 digit number生成唯一的 5 位数字
【发布时间】:2010-08-05 19:40:17
【问题描述】:

我被告知要编写生成唯一 5 位数字的程序(例如 12345 是唯一的,而 11234 不是)
我写了以下代码

#include <iostream>
#include <stdlib.h>
#include <map>
using namespace std;
using std::rand;
const int k=99999-10234;
bool  unique(int t){

    map<int,int>my;
    map<int,int>::iterator it;
    while (t!=0){
        ++my[t%10];
    t/=10;
}
    for (it=my.begin();it!=my.end();it++){

        if ( it->second>0) {
             return false;
        }
    }

       return true;
}
int main(){
    int m=0;
     m= 10234+ rand()%k;
    if (unique(m)){
         cout<<" unique number was generated =:"<<m<<" ";
    }
    else{

        do{


             m=10234+rand()%k;
               if (unique(m)){
                   cout<<"unique  number was generated"<<m<<" ";
                break;
               }

    }   while(!unique(m));


    }


     return 0;
}

但它没有显示任何输出,请帮我看看我的代码有什么问题?

【问题讨论】:

    标签: c++ algorithm permutation


    【解决方案1】:

    我认为行:

    if ( it->second>0) {
    

    应该是:

    if ( it->second>1) {
    

    因为当您找到数字的第一个实例并将其放入地图时,地图中该数字的值将是 1,而不是 0。

    【讨论】:

      【解决方案2】:

      我想有更简单的方法来生成您需要的数字,例如

      std::vector<int> digs;
      for (int i = 0; i < 10;++i)
          digs.push_back(i); // Init digits
      
      std::random_shuffle(digs.begin(), digs.end()); // Get random 10-digits number
      int result = 0;
      int i = 0;
      while (result < 10000) { // Get 5-digit number from it
          result*=10;
          result += digs[i];             
          ++i;
      }
      
      cout << result << endl;
      

      【讨论】:

      • 这是更智能的算法。不过,我会在洗牌后直接打电话给std::copy(digs.begin(), digs.begin() + 5, std::ostream_iterator(std::cout));。为什么要花费 7 行来获取 int 中的所有十进制数字,而 operator
      • 那些多余的(?)行只是为了处理第一个数字为“0”的情况 - 所以从技术上讲,前 5 位数字不会产生 5 位数字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多