3

8進数を10進数に変換するプログラムを書いています。それは正しくコンパイルされ、すべてが正しくコンパイルされますが、私の変換コードには大きな問題があります。それは私には完全に論理的に思えますが、どういうわけか私がプログラムを実行すると、変換が間違っています(つまり、1が36に変換されます)誰かが何が間違っているのか指摘できますか?

 public static int convert(int octal)
{
    int d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0;

    if(octal >=9999999){
    d8 = (octal-(octal%10000000));}
    if(octal >=999999){
    d7 = (octal-(octal%1000000));}
    if(octal >=99999){
    d6 = (octal-(octal%100000));}
    if(octal >=9999){
    d5 = (octal-(octal%10000));}
    if(octal >= 999){
    d4 = (octal-(octal%1000));}
    if(octal >= 99){
    d3 = (octal-(octal%100));}
    if(octal >= 9){
    d2 = (octal-(octal%10));}
    if(octal >= 0){
    d1 = (octal-(octal%1));}


    octal = (d8 * 8^7) + (d7 * 8^6) + (d6 * 8^5) + (d5 * 8^4) + (d4 * 8^3) + (d3 * 8^2) + (d2 * 8^1) + (d1 * 8^0);

    return octal;

}

これは私の変換メソッドです。私の主なメソッドは、int8進数を収集する方法です。

4

4 に答える 4

7

これが問題です:

8^7

^オペレーターはあなたが思っていることをしません。バイナリXORを実行します...

しかし、全体のデザインは明らかに疑わしいと思います。int値は8進数やその他の基数ではなく、単なる整数です。10進数は、10進数で「10」、16進数で「A」、8進数で「12」のいずれで表現されていても、10進数です。8進数として解析する文字のシーケンスがある場合、メソッドへの入力は、Stringではなく、である必要がありintます。

于 2012-10-30T16:01:06.603 に答える
4

あなたのメソッドは整数 (一般的に文字列表現では 10 進数で表されます) を受け入れ、出力するものも整数であるため、実際には「8 進数の整数」にはなっておらず、他の整数に変更されています。完全に。整数を 8 進数に正しく変換しようとしているのに、その 8 進数を 10 進数として誤って解釈しています。

整数を 8 進文字列表現に変換したい場合は、次のメソッドを使用できます。

public static String convert(int number) {
    Integer.toOctalString(number);
}

そして、10 進数であるかのように解析された 8 進数の文字列を表す int を本当に返したい場合は、次のように簡単に実行できます。

public static int convert(int number) {
    return Integer.parseInt(Integer.toOctalString(number));
}
于 2012-10-30T16:50:11.847 に答える
1

反復的なコードがある場合は、ループを検討してください。

public static void main(String... args) {
    for (long i = 7, j = 7; i > 0; i = i * 10 + 1, j = j * 8 + 1) {
        long c = convert(i);
        if (c != j)
            throw new AssertionError(i + ": " + c + " != " + j);
        System.out.println(i + " = > " + j);
    }
}

public static long convert(long octal) {
    long ret = 0;
    for (long i = 1000000000000000000L, j = 1L << (3 * 18); i > 0; i /= 10, j >>= 3)
        ret += j * (octal / i % 10);
    return ret;
}

版画

7 = > 7
71 = > 57
711 = > 457
7111 = > 3657
71111 = > 29257
711111 = > 234057
7111111 = > 1872457
71111111 = > 14979657
711111111 = > 119837257
7111111111 = > 958698057
71111111111 = > 7669584457
711111111111 = > 61356675657
7111111111111 = > 490853405257
71111111111111 = > 3926827242057
711111111111111 = > 31414617936457
7111111111111111 = > 251316943491657
71111111111111111 = > 2010535547933257
711111111111111111 = > 16084284383466057
7111111111111111111 = > 128674275067728457
于 2012-10-30T16:18:52.497 に答える
1

あなたには根底にある誤解があり、それがあなたを混乱させ続けています。

それ自体、「8 進数」などというものはありません。Anintは 10 進数でも、ローマ数字でも、8 進数でもなく、ただの数字です。

「8 進数」とは、実際には「数値の 8 進数表現を含む文字列」を意味します。

于 2012-10-30T22:49:00.270 に答える