我正在尝试运行一个程序,该程序对大数的阶乘(比如 50!;即 3.041e+64 - 巨大!)执行某些操作,因此不适合我所使用的正常 int 数据类型知道(unsigned long long int 等)
我使用哪种数据类型来存储这些值?
P.S 我试图找到阶乘中的尾随零。以下是我的方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int FactorialFinder(int a)
{
if (a>1)
a= a* (FactorialFinder(a-1)) ;
return a;
}
int main()
{
printf("Enter number \n");
int num ;
scanf("%d",&num) ;
printf("number is %d\n",num);
printf("Factorial is %d",(num = FactorialFinder(num))) ;
int x=0, count = 0 ;
while(num>0)
{
x = (num%10) ;
if (x == 0)
count++ ;
else
break;
num= num/10 ;
}
printf("\nNumber of trailing zeroes is %d",count) ;
getchar() ;
return 0;
}
12 以内都可以正常工作!超过这个值,结果就会错误(从 17 开始,它开始返回负阶乘值(?),从 34 开始,它给出 0),我猜测是由于数据类型问题。有人可以帮我吗?
最佳答案
嗯,这些类型的数字不能正确地存储为单个数字,正如您所推断的没有数据类型来保存它们一样。处理大数的最佳方法是将它们存储为 int
类型或 char
类型的数组。
例如,您可以将 1234567898765
存储为数组 int big[14]
,其中,
big[0]=1
big[1]=2
.
.
.
big[13]=5 //last element
big[14]=-1 //to mark the end of number...
或者以相反的顺序,将-1
作为最后一个元素(选择对您的实现方便的选项)
现在是具有挑战性的部分,您必须创建用于加法、减法、乘法和您需要的其他运算的函数..有很多方法可以实现这些函数..尝试一下..或者您可以查找如何做到这一点,这是一个来源:click
这提供了最多 100 位数字的算术数字的实现,但是您可以尝试构建一个可以处理更大数字的算术数字:)
关于c - C 程序中使用的适当数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37690347/