C中的长精确数字?

时间:2014-10-10 05:23:04

标签: c types

我正在制作一个打印前100个Lucas数字的程序(它们就像Fibonacci),但最后几个数字不适合unsigned long long int。我尝试使用long double,但它不准确,我得到了一些我应该得到的差异。

这是一项家庭作业,我的老师明确指出我们不需要使用除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;
}

2 个答案:

答案 0 :(得分:4)

看起来你需要的只是补充。我认为有三种方法可以解决这个问题。

  • 如果您没有被禁止使用库,那么您将使用常用的许多bigint库之一。
  • 实施基于字符串的加法器。你基本上实现了你在三年级学到的加法。
  • 作为一个黑客,如果你的最大数字大约是两个unsigned long long ints,那么你可以将你的数字分成最高有效数字和最低有效数字。我会走这条路。

答案 1 :(得分: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;
}