问题描述:
条码打印.要求是唯一的序列.中间有一个日期,最后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 给了算法思路,但他的代码有问题。
我的分析:
我的代码:
/*
* 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);
}
}
}
没有评论:
发表评论