求1-100的阶乘

输入一个数,如果为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;
}


温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-27
我这个代码可以输出任意大小的整型数的阶乘来。供你参考……
#include "stdio.h"//
#include "math.h"//
#include "stdlib.h"//
char *FactorialLN(int n){
int i,j,k,len;
char *pa,*pb,*ptmp;
double dec=0;
for(n++,i=2;i<n;dec+=log10(i++));
len=(int)dec+2;
pa=(char *)malloc(len);
pb=(char *)malloc(len);
if(!pb || !pa){
printf("Application memory failure...");
exit(0);
}
for(i=0;i<len;*(pa+i)=*(pb+i++)=0);
for(i-=2,j=--n;j;*(pb+i--)=j%10,j/=10);
len--;
i++;
while(--n){
for(k=0;k<n;k++){
for(j=i;j<len;*(pa+j)+=*(pb+j++));
for(j=len-1;j>i;j--)
if(*(pa+j)>9){
*(pa+j)-=10;
(*(pa+j-1))++;
}
if(*(pa+i)>9){
*(pa+i--)-=10;
(*(pa+i))++;
}
}
ptmp=pa;
pa=pb;
pb=ptmp;
for(k=0;k<len;*(pa+k++)=0);
}
free(pa);
for(i=0;i<len;*(pb+i++)+='0');
return pb;
}
void main(void){
int n;
char *p;
printf("Please enter an integer.\nn=");
scanf("%d",&n);
printf("%d! = %s.",n,p=FactorialLN(n));
free(p);
printf("\n");
}本回答被网友采纳
第2个回答  2013-04-27
100!如果你不需要9.3326215443944152681699238856267e +157

精确计算可以回收利用直接求解

如果你需要找到精确的每一个数字,可以考虑使用一个数组,如果您需要,你可以参考类似的程序(找到的阶乘1000),与我的VB系列:<a href="http://zhidao.baidu.com/question/5205271.html" HTTP :/ / zhidao.baidu.com/question/5205271.html
第3个回答  2013-04-28
#include <stdio.h>

int main(int argc, char *argv[])
{
int n=0,i=0;
double s=1;
do{

scanf("%d",&n);
if(1<=n && n<=100)
{
for(s=1,i=1;i<n;i++)s*=i;
printf("%.10lg\n",s);
}
}while(1<=n && n<=100);

return 0;
}
相似回答