请问这个求阶乘的是否可以改进?
#include <stdio.h>int main()
{
int square(int i);
int factorial(int j);
int s1,s2,s,a = 2,b = 2;
s1 = square(a);
s2 = square(b);
s = s1 + s2;
printf("%d\n",s);
}
int square(int i)
{
int m;
m = factorial(i*i);
return(m);
}
int factorial(int j)
{
int k = 1;
for(;j > 0;j--)
{
k = j*k;
}
return(k);
} 本帖最后由 jackz007 于 2019-10-28 22:47 编辑
阶乘最大的问题是溢出,所以,在不会溢出条件下,确定出可计算的最大阶数十分关键,试试下面的代码:
#include <stdio.h>
int maxd(void)
{
unsigned long long n ;
int d ;
for(n = 0xffffffffffffffff , d = 0 ; (n = n / (d + 1)) > 1 ; d ++) ;
return d ;
}
unsigned long long fun(int n)
{
unsigned long long m ;
int k ;
m = 0 ;
if (n <= maxd()) for(m ++ , k = 0 ; k < n ; k ++) m *= (k + 1) ;
return m ;
}
int main(void)
{
int k , n ;
unsigned long long m ;
k = maxd() ;
printf("input an integer : " , k) ;
scanf("%d" , & n) ;
if(n > 0 && n <= k) printf("%I64u\n" , fun(n)) ;
else printf("out of range \n" , k) ;
}
本帖最后由 bin554385863 于 2019-10-29 05:15 编辑
#include <stdio.h>
int fact(int n)
{
int res = 1, int_max = INT32_MAX;
if(n < 0)//排除负数
{
return -1;
}
if(n == 0)//特殊值
{
return 1;
}
for(size_t i = n; i >= 1; i--)
{
int_max /= i;
}
if(int_max < 1)//判断是否会发生溢出
{
printf("基数过大,无法计算\n");
res = -1 ;
}
else
{
for(int i = 1; i <= n; i++)
{
res *= i;
}
}
return res;
}
int main(int args char * argc)
{
int a = 0;
scanf("%d", &a);
printf("%d", fact(a));
return0;
}
bin554385863 发表于 2019-10-29 03:25
好的,谢谢您!
页:
[1]