读书人

hdu1042计算N阶乘!解决方案

发布时间: 2012-09-04 14:19:30 作者: rapoo

hdu1042计算N阶乘!!!
我的代码是修改别人的,杭电上g++显示wrong answer其他(c,c++什么的)显示超时
#include<stdio.h>
#include<string.h>
#define N 9000
int main()
{
int n,s[N]={1,1},t,a,b;
while(scanf("%d",&n))
{
if(n==1||n==0)
{
printf("%d",n);
continue;
}
memset(s,0,N);
s[0]=1,s[1]=1,t=2,a=1,b=0;
while( 1 )
{
if(a <= *s ){NULL;}
else if(++t <= n )
{
b = 0 , a =1;
}
else
break;
b += s[a] *t;
s[a]=b%10000;
b=b/10000;
if(*s == a++ && b)
{
(*s) ++;
}
}
for(printf("%d",s[*s]);--*s >0;)
{
printf("%04d",s[*s]);
}
printf("\n");
}
return 0;
}
ac代码雨中飞燕的
#include<stdio.h>
#define N 10005
int main()
{
int t,a,b;
int n;
while(scanf("%d",&n)!=EOF)
{
t=2,a=1,b=0;
if(n==0||n==1){printf("1\n");continue;}
long s[N]={1,1};
for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
s[a]=(b+=s[a]*t)%10000,b/=10000;
for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
printf("\n");
}
return 0;
}
我想问下为什么会错,并且c++ g++ c 为什么错误类型不同

[解决办法]
代码是很强大 ,但是有点难看懂啊!写两个人人都可以看懂的!

探讨
#include<stdio.h>
#define N 10005
int main()
{
int i,j,len;
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0||n==1){printf("1\n");continue;}
long s[N]={1,1};
len = 1;
for (i = 2;i<=n;i++)
{
for (j= 0;j<len; j++)
{
s[j] = s[j]*i;
}
for(j =0 ;j<len-1;j++)
{
s[j+1] +=s[j]/10000;
s[j] = s[j]%10000;
}
if (s[j] > 10000 )
{
s[j+1] = s[j]/10000;
s[j] =s[j]%10000;
len++;
}
}
printf("%d",s[len-1]);
for (j =len-2;j>=0;j--)
printf("%04d",s[j]);
printf("\n");
}
return 0;
}


[解决办法]
首先你的代码有误,0的阶乘应该等于1,而不是0,为什么请问数学家。
vc6.0不是标准c++,在oj中做题的话请使用devc++编译器。另外建议找模板的话要找那些通用的,有些代码超短
的只有原作者才能懂。
例如这个:
C/C++ code
#include<iostream>#include<cmath>using namespace std;void calculate(int n){    int i,j,head,tail;    int len=(int)(n*log10((n+1)/2));  //计算n!有数数字的个数    len+=4;    //保险起见,多加4位    char *arr=(char *)malloc(len);    if(arr==NULL){        printf("alloc memory fail\n");        return ;    }    memset(arr,0,sizeof(char)*len);    head=tail=len-1;    arr[tail]=1;    for(i=2;i<=n;i++){        int c=0;        for(j=tail;j>=head;j--){            int p=arr[j]*i+c;            arr[j]=(char)(p%10);            c=p/10;        }        while(c>0){            head--;            arr[head]=(char)(c%10);            c/=10;        }    }//    printf("%ld!=",n);    for(i=head;i<=tail;i++)        printf("%c",arr[i]+'0');    printf("\n");    free(arr);}int main(){    int n;    while(scanf("%d",&n)==1){        if(n==0){            puts("1");            continue;        }        calculate(n);     }    return 0;} 

读书人网 >软件架构设计

热点推荐