1

こんにちは、整数値と浮動小数点値を表示するために、この除算 alg を取得しました。MAX_REM を取得するにはどうすればよいですか? 文字が格納されるバッファのサイズになるはずなので、サイズは桁数でなければなりませんが、それを取得する方法がわかりません。ありがとう!

void divisionAlg(unsigned int value)
{

    int MAX_BASE=10;
    const char *charTable = {"0123456789ABCDEF"};  // lookup table for converting remainders
    char rembuf[MAX_REM + 1];   // holds remainder(s) and provision null at the end
    int  index;                 // 
    int  i;                     // loop variable

    unsigned int rem;           // remainder
    unsigned int base;          // we'll be using base 10 
    ssize_t numWritten;         // holds number of bytes written from write() system call

    base = 10;

    // validate base
    if (base < 2 || base > MAX_BASE)
        err_sys("oops, the base is wrong");

    // For some reason, every time this method is called after the initial call, rembuf
    // is magically filled with a bunch of garbage; this just sets everything to null.
    // NOTE: memset() wasn't working either, so I have to use a stupid for-loop
    for (i=0; i<MAX_REM; i++)
        rembuf[i] = '\0';

    rembuf[MAX_REM] = 0;    // set last element to zero
    index = MAX_REM;        // start at the end of rembuf when adding in the remainders

    do
    {
        // calculate remainder and divide valueBuff by the base
        rem = value % base;
        value /= base;

        // convert remainder into ASCII value via lookup table and store in buffer
        index--;
        rembuf[index] = charTable[rem];

    } while (value != 0);

    // display value
    if ((numWritten = write(STDOUT_FILENO, rembuf, MAX_REM + 1)) == -1)
        err_sys("something went wrong with the write");

} // end of divisionAlg()
4

1 に答える 1

2

数字が何桁あるかを計算するための計算は次のとおりです。

digits = floor(log(number)/log(base))+1;

ただし、この場合、それは 32 以下であり、それを計算すると「高価」になるため、おそらく最悪のケースを想定するだけです。#define MAX_REM 32ということで、実際に入力した桁数を追跡しますrembuf(すでにそれを持っているので、実際にindexは追加費用はかかりません)。もちろん、書き出すバイト数も計算する必要がありますが、特別な計算は必要ありません。

于 2013-01-30T17:41:02.150 に答える