генерировать уникальный 5-значный номер

мне сказали написать программу, которая генерирует уникальное 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;
}

но он не показывает мне никакого вывода, пожалуйста, помогите мне, что плохого в моем коде?


person dato datuashvili    schedule 05.08.2010    source источник


Ответы (2)


Я думаю, что строка:

if ( it->second>0) {

Должно быть:

if ( it->second>1) {

Поскольку, когда вы найдете первый экземпляр цифры и поместите его на карту, он будет иметь значение 1 для этой цифры на карте, а не 0.

person Hans Olsson    schedule 05.08.2010

Я думаю, есть более простые способы генерировать нужное вам число, например.

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;
person Vladimir    schedule 05.08.2010
comment
Это более умный алгоритм. Однако я бы просто позвонил std::copy(digs.begin(), digs.begin() + 5, std::ostream_iterator(std::cout)); сразу после перетасовки. Зачем тратить 7 строк, чтобы получить все десятичные цифры в int, когда оператор ‹‹(ostream&, int) собирается выполнить обратную работу, чтобы получить их снова? - person MSalters; 05.08.2010
comment
Эти избыточные (?) строки предназначены только для обработки случая, когда 1-я цифра равна «0», поэтому технически первые 5 цифр не будут давать 5-значное число. - person Vladimir; 05.08.2010