簡體   English   中英

我如何計算一個非常大的數字,如 c 中的 (1000 digits),並使用數組打印出來

[英]How can I compute a very big digit number like (1000 digits ) in c , and print it out using array

如何在 C 中打印一個 1000 位數字與 3 1000相同的數字? 使用arr[1000]arr中的每個 position 都會得到一個數字。

void main() {
    unsigned int  Base, Power;
    int Digit[1000] = { 0 }, i;
    Base = 3;
    Power = 1000;
}

這是一個非常簡單的示例,可以幫助您入門。 這是用於加法(不是乘法或求冪),它用於 3 位數,而不是千位。 但它演示了將每個數字保存在數組的一個元素中的基本思想。 當你在計算機程序中加(或減,或乘)這樣的數字時,你可以使用你在學校做算術時所學的完全相同的技巧。

#include <stdio.h>

int main()
{
    int a[10], b[10], c[10];

    a[2] = 4; a[1] = 5; a[0] = 6;   /* 456 */
    b[2] = 7; b[1] = 8; b[0] = 9;   /* 789 */

    int partialsum = a[0] + b[0];
    c[0] = partialsum % 10;
    int carry = partialsum / 10;

    partialsum = a[1] + b[1] + carry;
    c[1] = partialsum % 10;
    carry = partialsum / 10;

    partialsum = a[2] + b[2] + carry;
    c[2] = partialsum % 10;
    carry = partialsum / 10;

    c[3] = carry;

    printf("%d%d%d%d\n", c[3], c[2], c[1], c[0]);
}

該程序的最大限制是它只能使用 3 位數字和 4 位總和。 您可能想要嘗試進行的第一個改進是保持對每個數字中實際數字位數的計數(可能在其他變量中)。

另請參閱此問題及其答案及其鏈接的副本。

假設Digit是一個數組(它是一個數組)(而不是一個數字),然后使用循環打印這些單個數字。

由於Digit存儲在堆棧 memory 中,您可以使用sizeof()運算符。

int length = sizeof(Digit) / sizeof(Digit[0]);
for(int i = 0; i < length; i++)
{
    printf("%d", Digit[i]);
}

另外,避免void main() { } ,使用int main() { }

C 沒有標准的多精度 integer package。您可以通過這種方式實現蠻力方法:

#include <stdio.h>

int multiply(char *num, int max, int p, int n) {
    int i, carry = 0;
    for (i = max; i > p;) {
        carry += (num[--i] - '0') * n;
        num[i] = '0' + carry % 10;
        carry /= 10;
    }
    while (carry) {
        num[--i] = '0' + carry % 10;
        carry /= 10;
    }
    return i;
}

#define N        3
#define POWER    1000
#define NUMSIZE  1000

int main() {
    char num[NUMSIZE];
    int p = NUMSIZE;
    num[--p] = '\0';
    num[--p] = '1';

    for (int i = 0; i < POWER; i++) {
        p = multiply(num, NUMSIZE - 1, p, N);
    }
    printf("%d^%d = %s\n", N, POWER, num + p);
    return 0;
}

Output:

3^1000 = 1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001

3 1000只有 478 位,1000 位需要 3 2094或 3 2095

你的問題由兩部分組成:

  1. 如何計算結果並將其寫入數組?
  2. 如何打印結果數組?

問題的前半部分已經在其他人提供的答案中得到了回答。 This answer提供了一個關於如何打印結果數組的解決方案,假設數組的元素是int類型(因為它們在問題中)。

如果數組中的每個int元素都是09之間的數字,表示一個數字,那么您可以使用以下 function 打印數組:

void print_digits( const int array[], int array_size )
{
    int i = 0;

    //skip leading zeros, but don't skip last zero
    for ( ; i < array_size - 1; i++ )
    {
        assert( 0 <= array[i] && array[i] <= 9 );
        if ( array[i] != 0 )
            break;
    }

    //print all remaining digits
    for ( ; i < array_size; i++ )
    {
        assert( 0 <= array[i] && array[i] <= 9 );
        printf( "%d", array[i] );
    }

    printf( "\n" );
}

這是一個演示程序:

#include <stdio.h>
#include <assert.h>

void print_digits( const int array[], int array_size )
{
    int i = 0;

    //skip leading zeros, but don't skip last zero
    for ( ; i < array_size - 1; i++ )
    {
        assert( 0 <= array[i] && array[i] <= 9 );
        if ( array[i] != 0 )
            break;
    }

    //print all remaining digits
    for ( ; i < array_size; i++ )
    {
        assert( 0 <= array[i] && array[i] <= 9 );
        printf( "%d", array[i] );
    }

    printf( "\n" );
}

int main( void )
{
    int digits[100] = {0};

    //set the number to 3.4 E+60
    digits[39] = 3;
    digits[40] = 4;

    print_digits( digits, sizeof digits / sizeof *digits );
}

該程序具有以下 output:

3400000000000000000000000000000000000000000000000000000000000

注意 memory 用一個 32 位的int來存儲09之間的單個數字有點浪費。 因此,使用char來代替浪費會更少,它保證能夠表示最多127個數字(這就足夠了,因為我們只需要能夠表示最多9數字)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM