2014-10-10 61 views
3

我正在製作一個打印前100個盧卡斯數字(它們就像斐波那契數字)的程序,但最後幾個數字不符合無符號long long int。我嘗試了使用long double,但這不是精確的,我得到了一些與我應該得到的結果的區別。C中的精確數字?

這是一項家庭作業任務,我的老師特別指定我們不需要使用除stdio.h以外的任何其他庫。

我嘗試了一種將字符串添加爲數字的方法,但它超出了經驗,我真誠地懷疑這是我們必須做的。

隨着不精確它看起來是這樣的:

#include <stdio.h> 

int main() 
{ 
    long double firstNumber = 2; 
    long double secondNumber = 1; 
    long double thirdNumber; 

    int i; 
    for (i = 2; i <= 100; i += 1) 
    { 
     thirdNumber = secondNumber + firstNumber; 
     firstNumber = secondNumber; 
     secondNumber = thirdNumber; 
     printf("%Lf, ", thirdNumber); 
    } 

    return 0; 
} 
+1

你知道數組嗎?例如,您可以將單個「數字」存儲爲數字數組,其中每個元素包含0到9.由於操作只是添加,因此實現數組添加應該相當容易(不要忘記在添加之後進行歸一化)。 – wallyk 2014-10-10 05:27:55

+0

@WhozCraig根據WolframAlpha,64位無符號整數的最大值是'18446744073709551615',但L100是'792070839848372253127'。 http://www.wolframalpha.com/input/?i=what+is+the+100th+Lucas+number%3F – Adam 2014-10-10 05:37:19

+0

閱讀[bignums](http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic ),並參見http://gmplib.org/ – 2014-10-10 07:17:48

回答

4

它看起來像你需要的是加法。我看到有三種方法可以解決這個問題。

  • 如果您未被禁止使用庫,那麼您將使用通常可用的許多bigint庫之一。
  • 實現一個基於字符串的加法器。你基本上會實現你在三年級學到的加法。
  • 作爲一種破解,如果您的最大號碼大致適用於兩個unsigned long long ints,那麼您可以將您的號碼分成最高有效位和最低有效位。我會走這條路。
+0

我試過使用一個庫,但到目前爲止,我只能在.Net上編程並且沒有這方面的經驗。這似乎很簡單...我下載了bign.lib或類似的東西,幷包括它,但由於某種原因,編譯器不認可big_n作爲新類型... – frostblooded 2014-10-10 05:37:50

+0

我認爲你的老師不希望你使用圖書館(分級將是一個巨大的痛苦)。但如果你堅持,請查看關於如何在你的平臺上使用庫的新手指南。較新的語言已經自動化了許多你需要做的事情來使用一個庫,C和C++仍然讓你手動完成它。這聽起來像是需要包含另一個標題,但是如果您遇到圖書館問題,請提出一個關於該問題的單獨問題。 – Adam 2014-10-10 05:42:41

+0

將數字存儲爲字符串效率非常低 – 2014-10-10 07:43:25

1

我在下面用到了在數組中存儲真正大的數字。通過一些評論粘貼下面的代碼。希望能幫助到你。

#include<stdio.h> 
int main() 
{ 
    int t; 
    int a[200]; //array will have the capacity to store 200 digits. 
    int n,i,j,temp,m,x; 

    scanf("%d",&t); 
    while(t--) 
    { 
     scanf("%d",&n); 
     a[0]=1; //initializes array with only 1 digit, the digit 1. 
     m=1; // initializes digit counter 

     temp = 0; //Initializes carry variable to 0. 
     for(i=1;i<=n;i++) 
     { 
      for(j=0;j<m;j++) 
      { 
       x = a[j]*i+temp; //x contains the digit by digit product 
       a[j]=x%10; //Contains the digit to store in position j 
       temp = x/10; //Contains the carry value that will be stored on later indexes 
      } 
      while(temp>0) //while loop that will store the carry value on array. 
      { 
       a[m]=temp%10; 
       temp = temp/10; 
       m++; // increments digit counter 
      } 
     } 
       for(i=m-1;i>=0;i--) //printing answer 
       printf("%d",a[i]); 
       printf("\n"); 
    } 
    return 0; 
}