1

こんにちは、2 つの質問があります。1 つはタイトルにあるもので、もう 1 つはここにあります。unsigned long long は最大の整数ですか (最大量の文字を保持できますか)? 数百万文字 (数字) を保持できる int が必要なため、これは可能ですか? 私はCでコーディングしていますが、これは私を他の質問に結びつけています。画面に桁数を表示するにはどうすればよいですか? このようにする必要がありますか?:

printf("%d", intName.length)

みんな、ありがとう!!

4

4 に答える 4

1

文字数というのは、数字の桁数を意味していると思います。もしそうなら、この質問にはあなたが知る必要があるすべてがあり、これに似たコードが含まれています

int numberOfDigits(unsigned long long n) 
{
    if (n == 0)
        return 0;
    return floor( log10( abs( n ) ) ) + 1;
}

数百万桁の保持については、関数を含むThe GNU Multiple Precision Arithmetic Libraryなどのライブラリを使用して調べたいと思うでしょう。

size_t mpz_sizeinbase( const mpz_t op, int base )

これにより、番号の桁数がわかります。

于 2013-12-30T23:23:07.290 に答える
0

C99 は、サポートされている最大の整数型 (通常は 64 ビット) となる intmax_t (および uintmax_t) を提供します。

適合する C99 snprintf があると仮定すると、次の方法で桁数を取得できます。

length = snprintf(NULL, 0, "%llu", value);

unsigned long long 値の場合 (および uintmax_t の場合は %ju)。

それ以外の場合は、(yuk) でバッファーを渡すか、次のように手動で行う必要があります。

length = value < 10 ? 1 :
         value < 100 ? 2 :
         ...

もユック!

しかし、百万桁の整数が本当に必要な場合、これはまったく関係ありません。その場合、そのような大きな数を扱うには gmp などのライブラリを使用する必要があります。

于 2013-12-30T23:36:46.547 に答える
0

与えられたタイプのビット長の符号なし整数の最大 10 進長は、(数学的に、オーバーフローと丸め誤差を考慮せずに)bitlenで与えられます。1 + floor(log10(2^bitlen-1))近似値1/log2(10) ~ 4004.0/13301(連分数で得られます。 http://en.wikipedia.org/wiki/Continued_fractionを参照) から式が導かれます1 + bitlen * 4004 / 13301(計算上、つまり除算は切り捨てられます)。数学的な詳細は、以下のスニペットのコメントに記載されています。

#include <limits.h>
#include <stdio.h>

/**
 * Maximal number of digits in the decimal representation of an unsigned type.
 *
 * floor( log2(2^bitlen - 1) / log2(10) ) == floor( bitlen / log2(10) )
 * otherwise an integer n would exist with
 *     log2(2^bitlen - 1) / log2(10) < n < bitlen / log2(10)
 *     log2(2^bitlen - 1) < n * log2(10) < bitlen
 *     2^bitlen - 1 < 2^(n * log2(10)) < 2^bitlen
 *     2^bitlen - 1 < (2^log2(10))^n < 2^bitlen
 *     2^bitlen - 1 < 10^n < 2^bitlen
 *     which is impossible
 *
 * 1 / log2(10) ~ 0.301029995663981
 * 4004 / 13301 ~ 0.30102999774453
 *
 *     1 + floor( log10(2^bitlen - 1) )
 *  == 1 + floor( log2(2^bitlen - 1) / log2(10) )
 *  == 1 + floor( bitlen / log2(10) )
 *  <= 1 + floor( bitlen * 4004.0 / 13301 )
 *  == 1 + bitlen * 4004 / 13301
 * with equality for bitlen <= 13300 == 8 * 1662.5
 */
#define DECLEN(unsigned_t) (1 + CHAR_BIT*sizeof(unsigned_t) * 4004 / 13301)

int main(int argc, char *argv[]) {
    printf("unsigned char      : %zu\n", DECLEN(unsigned char));
    printf("short unsigned     : %zu\n", DECLEN(short unsigned));
    printf("unsigned           : %zu\n", DECLEN(unsigned));
    printf("long unsigned      : %zu\n", DECLEN(long unsigned));
    printf("long long unsigned : %zu\n", DECLEN(long long unsigned));
    return 0;
}
于 2015-05-05T14:48:37.590 に答える
0
printf("%llu", xxxxxxxxx);

 the ll (el-el) long-long modifier with the u (unsigned) conversion

あなたも使うことができます

 uint64_t a;
 uint32_t b;

ただし、int32_t、int64_t、uint64_t などの型を提供する inttypes.h ライブラリを含める必要があります。

于 2013-12-30T23:13:14.350 に答える