zoukankan      html  css  js  c++  java
  • 36进制 PHP

    短网址服务就是把长的URL地址转换成短的URL。如google提供的http://goo.gl/

    短网址 http://goo.gl/mwsQP 对应的网址就是 http://www.cnblogs.com/zjfree

    短网址参考:http://baike.baidu.com/view/2693499.htm

    那为什么URL那么多怎么就可以使用5位字符就表示呢? 注意短网址后面的5位字符是区分大小写的。

    如果五个字符是(0-9)、(A-Z)、(a-z),那5位字符可以穷举多个呢?62^5 = 916132832个 如果6位呢?62^6 = 56800235584个 500多亿个网址。

    这实际上是一个62进制的数字!那么在现实的应用中经常有缩短业务单号的需求,为什么不使用这种办法呢?为了方便输入我们不区分大小写。

    我们使用(0-9)、(A-Z) 这样就得到了一个36进制的数字。它能表示多少信息呢?

    进制说明

    10进制是 0-9 (0123456789)
    16进制是 0-F (0123456789ABCDEF)
    36进制是 0-F (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)

    信息量计算 多少位就是36的多少次方。

    1位时 36^1 = 36
    2位时 36^2 = 1296
    3位时 36^3 = 46656
    4位时 36^4 = 1679616
    5位时 36^5 = 60466176
    6位时 36^6 = 2176782336
    7位时 36^7 = 78364164096

    10进制和36进制互转代码

    /// <summary>
    /// Convert36 的摘要说明
    /// </summary>
    public class Convert36
    {
    	public Convert36()
    	{
    		//
    		// TODO: 在此处添加构造函数逻辑
    		//
    	}
    
    	private const string BASE_CHAR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    	/// <summary>
    	/// 转换为段字符
    	/// </summary>
    	/// <param name="num"></param>
    	/// <param name="length"></param>
    	/// <returns></returns>
    	public static string GetShortNo(int num, int length)
    	{
    		string str = "";
    		while (num > 0)
    		{
    			int cur = num % BASE_CHAR.Length;
    			str = BASE_CHAR[cur] + str;
    			num = num / BASE_CHAR.Length;
    		}
    		if (str.Length > length)
    		{
    			str = str.Substring(str.Length - length);
    		}
    		else
    		{
    			str = str.PadLeft(length, '0');
    		}
    
    		return str;
    	}
    
    	/// <summary>
    	/// 解析段字符
    	/// </summary>
    	/// <param name="strNo"></param>
    	/// <returns></returns>
    	public static int GetShortNum(string strNo)
    	{
    		int num = 0;
    		for (int i = 0; i < strNo.Length; i++)
    		{
    			num += BASE_CHAR.IndexOf(strNo[i]) * (int)Math.Pow(BASE_CHAR.Length, strNo.Length - i - 1);
    		}
    
    		return num;
    	}
    }
    

    实例分析

    原订单号组成规则 1010101001 {年}{月}{日}{一天流水号} 长度为10位 它可表示00-00-00 到 99-12-31 (100年 约36500天)的时间 和一天内9999个订单不重复

    而使用36进制 {前3位表示日期}{后三位表示流水号} 长度6位 可表示46656天(约128年) 46656个流水号


    欢迎转载,转载请注明:转载自[ http://www.cnblogs.com/zjfree/ ]
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/zjfree/p/2266177.html
Copyright © 2011-2022 走看看