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'); 
}

 

 

 

posted @ 2014-08-12 10:41  牧师/preacher  阅读(718)  评论(0编辑  收藏  举报