曾经在大学时做过一个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‘); }
C# 进制转换 (没有数值的长度限制)
时间: 2024-11-05 16:27:14