将十进制转换为九进制的Java代码

5
如何将十进制中的长数字转换为九进制而不使用字符串?

9
数字本身没有底数,但数字的字符串表示法有底数。当你说你有一个十进制数时,实际上是指你有一个十进制的数字字符串表示法。这个问题是一个矛盾修辞法。 - Christoffer Hammarström
6个回答

10

FWIW,你的计算机内部所有的值实际上都是二进制的(我猜你已经知道了)。只有在进行字符串转换时才会显示为十进制(例如打印输出),因为像parseLong这样的方法假定输入的字符串是十进制的,而编译器在你编写代码时期望所有字面量都是十进制的。换句话说,所有内容都是二进制的,计算机只是为了方便我们人类将其转换成十进制或从十进制转换成二进制。

由此可见,我们应该很容易地将输出基数更改为其他值,从而获得相同值的以9为基数的字符串表示形式。在Java中,这可以通过将一个可选的额外基数参数传递到Long.toString方法中来完成。

long x=10;
System.out.println(Long.toString(x,9));

7
Long base10 = 10;
Long.valueOf(base10.toString(), 9);

实际上我需要它而不必将其转换为字符串。 - Emil
不,这不是作业。我实际上需要修改函数,以返回使用不同数字符号的九进制数。 - Emil
我不是很理解问题的背景。你能否在问题中举个例子呢? - mR_fr0g
2
除非是作业,否则通过字符串是最明智的选择,除非您有强烈的性能要求。否则,您只需重新实现valueOf()使用的算法(基本上是使用模数和整数除法从基数数字中挑选出基数为9的数字)。 - Pontus Gagge
1
不,你的方式是错误的。你把字符串“10”解释为9进制表示法。我相信问题的要点是从10进制的“9”转换成9进制的“10”,但你的答案正好相反。我想你想要用Long.toString(9, 9),它会返回"10" - Christoffer Hammarström
@Emil - 请检查我的评论,指出您实际所做的事情。 - Stephen C

6
“不将其转换为字符串而将其转换为九进制”实际上是什么意思?
九进制、十进制、二进制、十六进制只是表示数字的方式。该值本身并不取决于您如何表示它。“int x = 256”与“int x = 0xff”在编译器看来是完全相同的。
如果您不想“转换为字符串”(我理解为您不关心值的表示方式),那么您到底想做什么?

4
你需要将其转换为字符串才能将其转换为基数为9的数字。

当你写下

Long a = 123;

您正在隐含地假设它是使用十进制表示的。如果您想将其解释为基数为9的数字,那很好,但是没有任何一种语言(我知道的)能够突然以这种方式查看它,因此8+1将返回9而不是10。对于基数2、8、16和10,有本地支持,但对于任何其他基数,您必须将其视为字符串。(然后,如果您确定需要,请将其转换回长整型)


2
从技术上讲,你可以使用整数算术来完成它,而不需要使用“string”,但很难看出为什么你应该这样做。你可以选择任何一种方式:从(计算19^2+29+3)翻译到或者翻译成(生成十进制数148,意图被解释为基数9的等价物)。然而,我真的看不出有什么意义! - Pontus Gagge
好的,如果你手动做的话 :) - Michael Clerx

2
您需要应用将数字从一种进制转换为另一种进制的算法,通过重复模运算来实现。在这里查看Java实现。我在此报告该网站上找到的代码。变量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; 
}

M和N不是最清晰的变量名!我猜M是要转换的数字,而N是新的进制。虽然很有趣。 - Adrian Mouat
我只是复制了链接网站上找到的程序。实际上,M是要转换的数字,N是新的进制。 - Luca Martini
2
我不会使用那些使用显而易见的代码文档的网站的资源。 - Cephalopod

0
如果你真的可以做任何事情,但只是无法转换为字符串,请按照以下步骤操作:
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());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接