首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hdu1042计算N阶乘!解决方案

2012-09-04 
hdu1042计算N阶乘!!!我的代码是修改别人的,杭电上g++显示wrong answer其他(c,c++什么的)显示超时#include

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;} 

热点排行