作业帮 > 综合 > 作业

求1-100的阶乘输入一个数,如果为1-100,输出阶乘(超过8位用科学计数法四舍五入保留8位有效数字),否则退出程序,

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/05/03 09:17:30
求1-100的阶乘
输入一个数,如果为1-100,输出阶乘(超过8位用科学计数法四舍五入保留8位有效数字),否则退出程序,C语言该怎么计算?
或者帮我改好下面的程序.下面的程序有误.改得完全正确的再加100分
#include
#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 && n0 ){
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;
}
上面的结果计算一百的阶乘是对的,输出格式也对
求1-100的阶乘输入一个数,如果为1-100,输出阶乘(超过8位用科学计数法四舍五入保留8位有效数字),否则退出程序,
代码在四舍五入,遇到进位处为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;
}