本帖最后由 jackz007 于 2019-8-31 10:26 编辑
这个代码简化的是否到位?
#include <stdio.h>
unsigned int jiechen(int num)
{
unsigned int result ;
int k ;
if(num > 0) for(result = 1 , k = 1 , k <= num ; k ++) result *= k ;
else result = 0 ;
return result ;
}
main(void)
{
int a ;
unsigned int b ;
while(1) {
printf("请输入整数:") ;
if(scanf("%d" , & a) == 1) {
b = jiechen(a) ;
printf("结果为:%u\n" , b) ;
} else {
break ;
}
}
}
如果规定必须采用递归算法,那就是下面的代码:
#include <stdio.h>
unsigned int jiechen(int num)
{
unsigned int result ;
result = 0 ;
if (num > 1) result = num * jiechen(num - 1) ;
else if(num == 1) result ++ ;
return result ;
}
main(void)
{
int a ;
unsigned int b ;
while(1) {
printf("请输入整数:") ;
if(scanf("%d" , & a) == 1) {
b = jiechen(a) ;
printf("结果为:%u\n" , b) ;
} else {
break ;
}
}
}
这个代码采用 32 位整型变量,只能计算 12 以内的阶乘,如果改用 64 位整型变量,则可以计算 20 以内的阶乘,如果超出,计算结果将是溢出后的错误数值:
#include <stdio.h>
unsigned long long jiechen(int num)
{
unsigned long long result ;
result = 0 ;
if (num > 1) result = num * jiechen(num - 1) ;
else if(num == 1) result ++ ;
return result ;
}
main(void)
{
int a ;
unsigned long long b ;
while(1) {
printf("请输入整数:") ;
if(scanf("%d" , & a) == 1) {
b = jiechen(a) ;
printf("结果为:%I64u\n" , b) ; // 这一句有问题,试试写成这样:printf("结果为:%llu\n" , b) ;
} else {
break ;
}
}
}
上述代码采用 tdm-gcc 成功编译运行。 |