如何将十进制中的长数字转换为九进制而不使用字符串?
FWIW,你的计算机内部所有的值实际上都是二进制的(我猜你已经知道了)。只有在进行字符串转换时才会显示为十进制(例如打印输出),因为像parseLong
这样的方法假定输入的字符串是十进制的,而编译器在你编写代码时期望所有字面量都是十进制的。换句话说,所有内容都是二进制的,计算机只是为了方便我们人类将其转换成十进制或从十进制转换成二进制。
由此可见,我们应该很容易地将输出基数更改为其他值,从而获得相同值的以9为基数的字符串表示形式。在Java中,这可以通过将一个可选的额外基数参数传递到Long.toString
方法中来完成。
long x=10;
System.out.println(Long.toString(x,9));
Long base10 = 10;
Long.valueOf(base10.toString(), 9);
valueOf()
使用的算法(基本上是使用模数和整数除法从基数数字中挑选出基数为9的数字)。 - Pontus GaggeLong.toString(9, 9)
,它会返回"10"
。 - Christoffer Hammarström当你写下
Long a = 123;
您正在隐含地假设它是使用十进制表示的。如果您想将其解释为基数为9的数字,那很好,但是没有任何一种语言(我知道的)能够突然以这种方式查看它,因此8+1将返回9而不是10。对于基数2、8、16和10,有本地支持,但对于任何其他基数,您必须将其视为字符串。(然后,如果您确定需要,请将其转换回长整型)
M
必须包含要转换的数字,N
是新的进制。注意:为了使代码片段正常工作,必须满足N>=1 && N<=10
。如果N>10
,则需要使用字母而不是数字进行扩展。String Conversion(int M, int N) // return string, accept two integers
{
Stack stack = new Stack(); // create a stack
while (M >= N) // now the repetitive loop is clearly seen
{
stack.push(M mod N); // store a digit
M = M/N; // find new M
}
// now it's time to collect the digits together
String str = new String(""+M); // create a string with a single digit M
while (stack.NotEmpty())
str = str+stack.pop() // get from the stack next digit
return str;
}
public static long toBase(long num, int base) {
long result;
StringBuilder buffer = new StringBuilder();
buffer.append(Long.toString(num, base));
return Long.parseLong(buffer.toString());
}