阶乘函数只能数到 12
Factorial function only counts to 12
此阶乘函数在 13 及以上时开始给出错误结果。我不知道为什么。
#include <stdio.h>
int fatorial (int p);
int main() {
int x = 13;
int test = fatorial(x);
printf("%d", test);
}
int fatorial (int p) {
if (p <= 0)
return 1;
else
return p*fatorial(p-1);
}
对于 x = 0, 1, 2 ...12 它打印出正确的结果,但是对于 13!它打印 1932053504 这是不正确的。
例如,对于 x=20,它会打印 -210213273。
我知道这不是进行阶乘的最佳方法。这是我的功课,它必须是这样的。
如果您尝试这样做,您将获得 int
可以容纳的最大值:
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("%d\n", INT_MAX);
}
您的代码导致溢出。
如果你使用更大的类型,你可以获得更多的数字,但不是很多。你可以使用这个:
unsigned long long fatorial (unsigned long long p) {
if (p <= 0)
return 1;
else
return p*fatorial(p-1);
}
虽然它不会让你走得太远。如果您想要更大的整数,则需要找到一个用于更大整数的库或创建一些自定义解决方案。 https://gmplib.org/ 就是这样的一个图书馆,但这可能超出了您的作业范围。
顺便说一下,像 p <= 0
这样的条件并不好。表示负数的阶乘永远为1,为假
是因为12之后任意数的阶乘结果超出了int的大小
您可以试试下面的代码:
#include<stdio.h>
int main()
{
int a[100],n,counter,temp,i;
a[0]=1;
counter=0;
printf("Enter the number: ");
scanf("%d",&n);
for(; n>=2; n--)
{
temp=0;
for(i=0; i<=counter; i++)
{
temp=(a[i]*n)+temp;
a[i]=temp%10;
temp=temp/10;
}
while(temp>0)
{
a[++counter]=temp%10;
temp=temp/10;
}
}
for(i=counter; i>=0; i--)
printf("%d",a[i]);
return 0;
}
函数的结果太大了。我认为 big int 会更好地满足您的目的。 big int 允许您拥有更大的数字。还有,这就是我要做的。
int x = the number you want to factorialize
int ans = 1;
(Then instead of all of those functions)
for(var i = x; i > 0; i--) {
ans = ans*i;
}
System.out.println(ans);
Javascript link: https://jsfiddle.net/8gxyj913/
100!大约是 9.332622e+157。仅仅使用标准整数类型是不够的。 32 位 int
比 12 好!。使用 64 位整数数学,代码可以达到大约 21!
可以使用 并放弃精度。
而是考虑 string approach.
此阶乘函数在 13 及以上时开始给出错误结果。我不知道为什么。
#include <stdio.h>
int fatorial (int p);
int main() {
int x = 13;
int test = fatorial(x);
printf("%d", test);
}
int fatorial (int p) {
if (p <= 0)
return 1;
else
return p*fatorial(p-1);
}
对于 x = 0, 1, 2 ...12 它打印出正确的结果,但是对于 13!它打印 1932053504 这是不正确的。 例如,对于 x=20,它会打印 -210213273。
我知道这不是进行阶乘的最佳方法。这是我的功课,它必须是这样的。
如果您尝试这样做,您将获得 int
可以容纳的最大值:
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("%d\n", INT_MAX);
}
您的代码导致溢出。
如果你使用更大的类型,你可以获得更多的数字,但不是很多。你可以使用这个:
unsigned long long fatorial (unsigned long long p) {
if (p <= 0)
return 1;
else
return p*fatorial(p-1);
}
虽然它不会让你走得太远。如果您想要更大的整数,则需要找到一个用于更大整数的库或创建一些自定义解决方案。 https://gmplib.org/ 就是这样的一个图书馆,但这可能超出了您的作业范围。
顺便说一下,像 p <= 0
这样的条件并不好。表示负数的阶乘永远为1,为假
是因为12之后任意数的阶乘结果超出了int的大小
您可以试试下面的代码:
#include<stdio.h>
int main()
{
int a[100],n,counter,temp,i;
a[0]=1;
counter=0;
printf("Enter the number: ");
scanf("%d",&n);
for(; n>=2; n--)
{
temp=0;
for(i=0; i<=counter; i++)
{
temp=(a[i]*n)+temp;
a[i]=temp%10;
temp=temp/10;
}
while(temp>0)
{
a[++counter]=temp%10;
temp=temp/10;
}
}
for(i=counter; i>=0; i--)
printf("%d",a[i]);
return 0;
}
函数的结果太大了。我认为 big int 会更好地满足您的目的。 big int 允许您拥有更大的数字。还有,这就是我要做的。
int x = the number you want to factorialize
int ans = 1;
(Then instead of all of those functions)
for(var i = x; i > 0; i--) {
ans = ans*i;
}
System.out.println(ans);
Javascript link: https://jsfiddle.net/8gxyj913/
100!大约是 9.332622e+157。仅仅使用标准整数类型是不够的。 32 位 int
比 12 好!。使用 64 位整数数学,代码可以达到大约 21!
可以使用
而是考虑 string approach.