zoukankan      html  css  js  c++  java
  • 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('
    '); 
    }
  • 相关阅读:
    【PAT甲级】1128 N Queens Puzzle (20分)
    Codeforces Global Round 7D(马拉车/PAM,回文串)
    【PAT甲级】1127 ZigZagging on a Tree (30分)(已知中序后序蛇形输出层次遍历)
    SDOI2012 体育课
    APIO2018 Circle selection 选圆圈
    [科技] 求数列的前k次方和
    APIO2016 Fireworks
    CTSC2018 暴力写挂
    ZJOI2018 胖
    SDOI2017 数字表格
  • 原文地址:https://www.cnblogs.com/preacher/p/3906734.html
Copyright © 2011-2022 走看看