首页 > 代码库 > C# 进制转换 (没有数值的长度限制)

C# 进制转换 (没有数值的长度限制)

  曾经在大学时做过一个c的进制转换算法,那时由于技术的局限性,数值的大小受到限制(系统数据类型长度限制),多年以后,自己那台学习机陈旧后感觉要报废了,整理了一下里面的东西,偶尔在一个角落里发现了这个转换算法,觉得它还有改进的地方,可以让它功能更强大(当时想过要转换超长数值,但受系统数据类型的局限性、个人开发语言深度的认知、以及视界观的狭隘,没能想到可以解决计算超长数据的有效的方法),这里我会将多年前大学里写的那段,和我修改后的粘贴出来,以飨读者。
 
传入参数:
string x 是超大数的字符串格式,当然越大越能显示出本方法的威力。
int y 是将传入的十进制数(前面的字符串)转换为32位进制以内的其他进制,范围(2~32)
        
说明:说是超长数据,其实还是受到最大
数限制,负责会溢出,不过这个最大数真的是太太大了,估计还没诞生过的吧?!呵呵。
     static string DecimalismConversion(string x, int y)        {            Stack stack = new Stack();            int length = Int64.MaxValue.ToString().Length - 2;            while ( x!="")            {                string quotient = string.Empty;                string remainder = string.Empty;                int count = 0;                Int64 i64 = 0;                while (count * length < x.Length)                {                    string str = x.Substring(count * length, Math.Min(length, x.Length - count * length));                    i64 = Convert.ToInt64(remainder + str);                    remainder = (i64 % y).ToString();                    quotient += (i64 / y).ToString().PadLeft(str.Length, 0);                    count++;                }                Int64.TryParse(remainder, out i64);                if (i64 % y < 10) stack.Push((char)(i64 % y + 48));                else stack.Push((char)(i64 % y + 55));                x = quotient.TrimStart(new char[] {  , 0 });            }            return new string(stack.ToArray());        }

 

以下这段是它的原身,现在想想就可笑,以前写程序设计(c语言),那么难看。

int main(int x,int y) {      int i=0;    char a[17];     printf("Input:"); L:     scanf("%d %d",&x,&y);     if(x<=0||y<=2||y>=33)    {        printf("Input error,input again:");        goto L;    }     while(x!=0)    {         if(x%y<10)            a=(char)(x%y+48);         else            a=(char)(x%y+55);         x=x/y;     }     for(i=i-1;i>=0;i--)        printf("%c",a);     putchar(\n); }