输入一个数,如果为1-100,输出阶乘(超过8位用科学计数法四舍五入保留8位有效数字),否则退出程序,C语言该怎么计算?
或者帮我改好下面的程序。下面的程序有误。 改得完全正确的再加100分
#include<stdio.h>
#define LD long double
#define ULL unsigned long long
LD f(int n){
return (n==1 ? (LD)1 : ((LD)n *f(n-1)));
}
int main()
{
int flag=0,i=0,n=0;
LD y;
char str[20];
while(scanf("%d",&n)==1 && n<=100 && n>0 ){
y=f(n);
if(y < 1.0e8 )
printf( "%d! = %d\n",n,(ULL)y );
else
{
sprintf(str,"%1.8e",y);
if( str[9] > '4')
{
str[8]++;
}
for(i=9;str[i];i++)
str[i] = str[i+1];
printf( "%d! = %s\n",n, str);
}
}
return 0;
}
上面的结果计算一百的阶乘是对的,输出格式也对
代码在四舍五入,遇到进位处为9时处理有误,比如16。
#include<stdio.h>
#define LD long double
#define ULL unsigned long long
LD f(int n){
return (n==1 ? (LD)1 : ((LD)n *f(n-1)));
}
int main()
{
int flag=0,i=0,n=0;
LD y;
char str[20];
while(scanf("%d",&n)==1 && n<=100 && n>0 ){
y=f(n);
if(y < 1.0e8 )/*不超过8位,整形输出*/
printf( "%d! = %d\n",n,(ULL)y );
else
{
sprintf(str,"%1.8e",y);
if( str[9] > '4')/*超过4,进一位*/
{
if(str[8]<'9')
str[8]++;
else
{ i=8; while(str[i]=='9') str[i--]='0';str[i]++; }/*为9时不能直接+1,改为0后,进位*/
/*当所有位都为9时,需要进位并增加e后面的级数,还需要特殊处理,但是这种情况在1-100不会出现*/
}
for(i=9;str[i];i++)
str[i] = str[i+1];
printf( "%d! = %s\n",n, str);
}
}
return 0;
}