2014-10-10 107 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; 
}