根据手机号码,算出一个6位数,每个手机号算出的数是唯一的。算法过程无所谓,要求简单,有实现过程。

解决方案 »

  1.   

    中国有4亿多手机用户
    你的要求是6位数字,最多能区分一百万个号码
    is impossible
      

  2.   

    如果允许使用的字母的话,试试下面的方法
    先了解一下36进制
    36进制和10进制对应
    36进制: 1,2,3...9,a,b...z
    10进制: 1,2,3...9,10,11..35
    有了上面的认识之后,接下来我们开始谈算法:
    因为前3位一般为131,132,133,134,135,136,137,138,139,159之类的类最多不会超过36个,
    所以我们前面3位我们用一位36进制可以代替,具体怎样对应随你了
    后面的8位,因为十进制的99999999(这个应该算是8位最大的数了吧)转换为36进制为NM4HR,为5位数,所以后面的手机号后面的8位数完全可以转换为一个5位的数,
    加上前面的1位,正好6位,符合6位数的要求,只不过不知楼主是否允许出现字母,如果不允许的话,就没办法了
    具体10进制转换为36进制的转换原则为除36取余法
      

  3.   

    6位数也需要3byte存储呢,呵呵,3byte能存8位数
      

  4.   

    小和的所谓36进制,即数字加字母的组合,按他的处理还可以用,
    手机前三位组合不过一百,后8位组合可达一亿,六位36进制组合可达20多亿,可以满足但是黑馬王子的16进制是不行的。。与no title 所说的无关,我们是说字符的组合,与存贮无关。
      

  5.   

    可以借鉴一下这个函数:
    function CalkBlkCRC16( buf: pointer ; size: integer ) : WORD;
    begin
            result:=$FFFF;
            while size > 0 do begin
              result := result xor BYTE(buf^);
              result := Swap(result);
              result := result xor ((result and $ff00) shl 4);
              result := result xor (result shr 12);
              result := result xor ((result and $ff00) shr 5);
              Dec(size);
              Inc(DWORD(buf));
            end;
    end;