1

基数 10 の数値を基数 n の数値 (n は最大 10) に変換できるアルゴリズムを作成しようとしています。しかし、いくつかの奇妙な理由により、C の次のアルゴリズムは各基数の特定の臨界点で失敗します。たとえば、基数 2 および基数 3 の変換では、それぞれ 1023 および 52,487 までのすべての数値が機能しますが、それを超える数値は奇妙な負の結果を生成します。なぜこれが起こっているのかわかりません。誰でも私を助けることができますか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int returnint;

int baseconvert(int number,int base) {
    if(number == 0 || base == 10) {
        return returnint;
    }
    returnint = (number % base) + (10 * baseconvert(number / base, base));
    return returnint;
}

int main() {
    fprintf(stdout,"%d\n",baseconvert(1023,2));
    fprintf(stdout,"%d\n",baseconvert(52487,3));
}

編集:

上記の print ステートメントの出力結果は次のとおりです。

1410065408
-2094967296
4

4 に答える 4

1

あなたのアルゴリズムは、数と基数の範囲が非常に限られています。底が小さいほど、それを表すために必要な桁数が多くなります。また、結果を 10 進形式で保存するため、使用可能なデータ範囲がすぐに無駄になります。すべての可能な入力の結果を保持できる基本的なデータ型はありません。たとえば、最大 31 ビットの 10 進数 (通常の整数、符号ビットを削除) は、31 桁の出力になります!

これに対処するには、いくつかのオプションがあります。

  • 十分な大きさのスタックを割り当て、数字をプッシュします。完了したら、スタックの内容を出力します。
  • 保存せずに数字をすぐに出力します。これにより、何かを割り当てる必要がなくなります。例えば:

#include <stdio.h>

void baseconvert(int number,int base) 
{
    if(number > 0) 
    {
        int digit = (number % base);
        baseconvert(number / base, base);
        printf("%d",digit);
    }
    else
    {
        printf("\n");
    }
}

int main() 
{
    baseconvert(1023,2);
    baseconvert(52487,3);
}
于 2014-07-23T18:14:12.300 に答える
0

私が知っているすべてのプロセッサでは、整数は既にバイナリ形式で格納されています。これは基数 2 を意味します。この値は、任意の基数で表示できます。printf() とその仲間を使用すると、基数 10 (%d) および基数 16 (%x) で簡単に印刷できます。バイナリ (基数 2) の整数値を基数 n の文字表現に変換する方法を想像することは難しくありません。

あなたがやっているように、あなたが本当に整数の実際の値を変更しようとしているとは思えません。上で @ThoAppelsin が言ったように、表示用に選択したベースに関係なく、バッグ内のリンゴの数は同じままです。

任意の基数の整数を (数字で) 表すメソッドを作成するだけで、オーバーフローの問題も解決します!

于 2014-07-23T18:26:33.240 に答える