星期四, 九月 24, 2009

算法挑战 36进制条码序列号生成器[修正]

问题描述:
条码打印.要求是唯一的序列.中间有一个日期,最后3位为流水号.但打印的张数会超过999;
因此必须用到26个大写字母,用36进制的话3位可以表示36*36*36=46656个数字。
现在要求如下:
999以前就是普通数字(001~999),再多就开始在百位使用字母
即999的后一个数字为A00此时十位和个位还不能使用字母(平时打印会少于3600张,为了客户看起来方便),
只有在百位将Z用完后才允许在十位使用字母,十位用完才允许个位使用字母
注意事项:
1)不能重复
2)数字个数应达到46656个
3)效率不能太低
4)请在本地测试没有重复序列号
博客: http://www.cnblogs.com/shinn/archive/2008/04/22/1147473.html 给了算法思路,但他的代码有问题。
我的分析:

 

[jjwt.png]

[jieguo.png]

我的代码:

/*


 * Created by SharpDevelop.


 * User: liuyk


 * Date: 2009-9-22


 * Time: 22:05


 */


using System;


namespace ConvertTo36X


{


    /// <summary>


    /// 把[0-46655]转换成36进制的3位序列.


    /// </summary>


    public class ConvertTo36X


    {


        private readonly char[] Char26=new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};


        private readonly char[] Char36=new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};


 


        public string ConvertNum(int num)


        {


        if(num<0 || num>46655)


        {


        throw new Exception("输入的数字超出范围");


        }


        else if(num>=12960)


        {


        string value="";


        num-=12960;


        char h=Char36[((int) (num/936))%36];


        char t=Char36[((int) (num/26))%36];


        char d=Char26[num%26];


        return value+h+t+d;


        }


        else if(num>=3600)


        {


        string value="";


        num-=3600;


        char h=Char36[(int)((num%360)/10)];


        char t=Char26[(int)(num/360)];


        int d=num%10;


        return value+h+t+d;


        }


        else if(num>=10)


        {


        string value="";


        char h=Char36[(int)(num/100)];


        num=num%100;


        int t=(int)(num/10);


        int d=num%10;


        return value+h+t+d;


        }


        else


        {


        return "00"+num;


 


        }


 


        }


 


    }


 


 


 }






/*


 * Created by SharpDevelop.


 * User: liuyk


 * Date: 2009-9-24


 * Time: 17:09


 * 


 * To change this template use Tools | Options | Coding | Edit Standard Headers.


 */


using System;


using   System.IO;   


namespace ConvertTo36X


{


    class TestConvertTo36


    {


        public static void Main(string[] args)


        {


            Console.WriteLine("Hello World!");


 


            // TODO: Implement Functionality Here


                        ConvertTo36X xx=new ConvertTo36X();


            FileStream   fileName  =   new   FileStream("Temp.txt",FileMode.OpenOrCreate);  


            StreamWriter sw = new StreamWriter(fileName);


 


 


            //System.Console.WriteLine(xx.ConvertNum(46655));


        for (int j=0;j<=46655;j++){


            System.Console.WriteLine(j);


            sw.WriteLine(xx.ConvertNum(j)); 


 


        }


            sw.Close();


 


 


            Console.Write("Press any key to continue . . . ");


            Console.ReadKey(true);


        }


    }


}

没有评论: