要求是这样的,随机取一个100000以下的数字a,然后要求产生1个随机数字b,b要可以被a整除,比如随机产生了一个88888(a),然后随机取出一个能被其整除的22(b)我原来的算法是for i=1;i<=a; i++,然后一个一个试,将结果放进一个数组,然后在这个数组里随机取一个,这样实在太傻了,可是又想不出更好的办法,哪位能帮帮忙?

解决方案 »

  1.   

    CTime t = CTime::GetCurrentTime();
    int n = t.GetMinute() * 60 + t.GetSecond();
    while(n-- > 0)
    {
    rand();
    }
    const int N = 100000;
    UINT A = rand()%N;
    UINT a = A ;
    CUIntArray arr;
    for(UINT i = 2 ; i <= a ; i ++ )
    if(a % i == 0)
    {
    do {
    a = a/i ;

    while(a%i == 0);
    arr.Add(i);
    i = 2 ;
    }
    int index = rand()%arr.GetSize() ;
    UINT B = arr[index] ;
      

  2.   

    只需for(UINT i = 2 ; i <= sqrt(a) ; i ++ )即可
      

  3.   

    只需从2到sqrt(a)就可找全a的所有约数,不过当整除时不但要保存i,还要同时保存a/i; 
    只有找全所有的约数,才可能做到机率均等,如果可以机率不均等话,可以随机产生一个从
    2到a/2的数c ,看c能不能整除,如不能则c++ 。最终得到b
      

  4.   

    //取得当前时间的分钟和秒
    CTime t = CTime::GetCurrentTime();
    int n = t.GetMinute() * 60 + t.GetSecond();
    while(n-- > 0)
    {
    rand();
    }
    const int N = 100000;
    UINT A = rand()%N;
    UINT a = A ;
    CUIntArray arr;//把A的所有因子不重复的放进数组
    for(UINT i = 2 ; i <= a ; i ++ )
    if(a % i == 0)
    {
    do {
    a = a/i ;//除掉所有的i.

    while(a%i == 0);
    arr.Add(i);
    i = 2 ;
    }
    int index = rand()%arr.GetSize() ;
    UINT B = arr[index] ;rand()取随机数,并不随机,第一次执行结果相同.
      

  5.   

    事先把素数都提取出来,保存到一个文件当中
    对于a只要判定它是不是能够被这些素数整除
    检测范围就是2到sqrt(a)之间
      

  6.   

    he_zhidan(何志丹:风云伐日)不一定可行,因为在2-a区间未必可以找到符合条件的数
      

  7.   

    vollin(林尚义) 的方法是比较可行的!另外使用rand前,应该使用srand(time(NULL));初始化以下随机数序列!
      

  8.   


    to  he_zhidan(何志丹:风云伐日) 兄台,要随机不用那么麻烦,只要提前做一个随机种子就OK了。只要在第一个rand()前加上下面一句就可以:
    srand( (unsigned)time( NULL ) );
      

  9.   

    首先取一100000以下的数字N ,然后判断是不是 素数 ,为了提高效率你可以把100000 以内的素数全部找出来,然后写在一张表上 ,如果N不是素数,在随机取一树M
    while((N % M) != 0)
    {
      
    }
      

  10.   

    void Generate(int&a,int&b)
    {
        srand(time(NULL));
        a = rand()%100000+1;
        while( a%(b=rand()%a+1) );
    }