簡體   English   中英

如何求大數?

[英]How to sum large numbers?

我正在嘗試計算1 + 1 * 2 + 1 * 2 * 3 + 1 * 2 * 3 * 4 + ... + 1 * 2 * ... * n其中n是用戶輸入。 它適用於n到12的值。我想計算n = 13n = 14n = 15的總和。 我該如何在C89中做到這一點? 據我所知,我只能在C99或C11中使用unsigned long long int

  1. 輸入13,結果2455009817,預期6749977113
  2. 輸入14,結果3733955097,預期93928268313
  3. 輸入15,結果1443297817,預期1401602636313

我的代碼:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    unsigned long int n;
    unsigned long int P = 1;
    int i;
    unsigned long int sum = 0;
    scanf("%lu", &n);
    for(i = 1; i <= n; i++)
    {
        P *= i;
        sum += P;
    }
    printf("%lu", sum);
    return 0;
}

實際上,您需要一些任意精度的算術庫(又名bigintbignum )。 我的建議是GMPlib,但還有其他建議。

不要嘗試編寫自己的bignum庫。 雖然存在高效且聰明的算法,但它們不直觀且難以掌握(您可以找到有關該問題的整本書)。 另外,現有的庫(例如GMPlib)正在利用標准C編譯器不會發出的特定機器指令(例如ADC-帶進位加法)(來自純C代碼)。

如果這是一項家庭作業,並且您不允許使用外部代碼,請考慮使用一個數字表示基數或基數 1000000000(十億),並以一種非常幼稚的方式為自己編寫操作代碼,類似於您從小就學到的方法。 但是請注意,存在更有效的算法(並且實際的bignum庫正在使用它們)。

一個數字可以以1000000000為基數表示,它具有一個unsigned數組,每個數組都是以1000000000為基數的“數字”。因此,您需要管理數組(可能是使用malloc分配的堆)及其長度。

您可以使用double ,特別是如果您的平台使用IEEE754。

這樣的double精度數為您提供53位精度,這意味着整數精確到2的53次冪。對於這種情況,這已經足夠了。

如果您的平台不使用IEEE754,請查閱有關采用的浮點方案的文檔。 可能就足夠了。

當您剛剛超過MaxInt的極限時,一種簡單的方法是對一個合適的n進行10 ^ n模的計算,並且您執行與浮點計算相同的計算,但是將所有內容除以10 ^ r。將為您提供前n位數字,而后一項結果將為您提供答案的最后幾位數字,並刪除前r位數字。 然后,由於舍入誤差,此處的最后幾位數字將不准確,因此您應選擇小於n的ra位。 在這種情況下,取n = 9且r = 5會很好。

暫無
暫無

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

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