2010-08-05 65 views
1

有人告诉我,写程序,生成唯一的5位数字(例如12345是唯一的,11234不)
我有写下面的代码产生独特的5位数号码

#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; 
} 

,但它不告诉我任何输出请帮我在我的代码中有什么不好?

+2

需要'家庭作业'标签吗? – 2010-08-05 11:39:32

回答

5

我觉得行:

if (it->second>0) { 

应该是:

if (it->second>1) { 

因为当你发现一个数字的第一个实例,并把它放在地图上,它会拥有价值1该数字在地图中,而不是0.

+0

oi是对不起,谢谢ho1 – 2010-08-05 10:44:54

3

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

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; 
+0

这是更聪明的算法。不过,我只是在洗牌之后直接调用了'std :: copy(digs.begin(),digs.begin()+ 5,std :: ostream_iterator(std :: cout));'。当操作符<<(ostream&,int)要做相反的工作以使它们再次出来时,为什么要花7行来获取int中的所有十进制数字? – MSalters 2010-08-05 12:30:27

+0

那些多余的(?)线只是处理第一个数字为'0'时的情况 - 所以技术上的前5个数字不会产生5位数字。 – Vladimir 2010-08-05 12:45:28