如题所述
#include <stdio.h>
unsigned f(unsigned *n) {
unsigned i = 2,res = 1,lres = 1;
while(1) {
lres *= i;
if(lres < res) {
*n = i - 1;
return res; // 溢出后,阶乘的结果会变小。
}
res = lres;
i++;
}
return i; // 本行是不会执行的,这是为了函数需要返回值而设的。
}
int main() {
unsigned n;
printf("%u! = %u\n\n",n,f(&n));
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-10-08
int prev,now,n;
每次计算前先将上次结果保存到prev;然后计算的结果保存到now;
判断prev!=now/n;则表示溢出本回答被提问者采纳
每次计算前先将上次结果保存到prev;然后计算的结果保存到now;
判断prev!=now/n;则表示溢出本回答被提问者采纳
第2个回答 2011-10-08
C语言对整数是不检测溢出的
第3个回答 2011-10-08
unsigned int result,last_result=0;
result=fn(n);
if(result<last_result)
{
/*overflow occurred,last_result and n-1 is the max available value*/
}
last_result=result;
result=fn(n);
if(result<last_result)
{
/*overflow occurred,last_result and n-1 is the max available value*/
}
last_result=result;
第4个回答 2011-10-08
int nn(int n)
{
int tmp1,tmp2;
if(n==0)return 1;
tmp1=nn(n-1);
tmp2=n*tmp1;
if(tmp1>tmp2)printf("overflow %d",n);
return tmp2;
}
main()
{
nn(10);
}追问
{
int tmp1,tmp2;
if(n==0)return 1;
tmp1=nn(n-1);
tmp2=n*tmp1;
if(tmp1>tmp2)printf("overflow %d",n);
return tmp2;
}
main()
{
nn(10);
}追问
给我一个用for语句的循环写一个程序,直接将N阶乘溢出时N值输出来
追答int nn(int n)
{
if(n==0)return 1;
return n*nn(n-1);
}
main()
{
int i,tmp,tmp1;
tmp=1;
for(i=0;;i++)
{
tmp1=nn(i);
if(tmp1<tmp)
{
printf("over =%d\n",i);
break;
}
tmp=tmp1;
}
}