菜鸟求一个解 N!的程序 (斑竹必进)
求一个解 N 的阶乘的程序 1<=N<=1000
斑竹来了请务必回一个,如果你的可以分照给不误,如果你瞧不起我那就求你别删我的贴就感激不尽!
那样非但对我不公平,对回答问题的朋友更是不公平
问题点数:20、回复次数:35Top
1 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-09-01 21:48:39 得分 0
模拟累加~~~~用数组来存储Top
2 楼hcj2002(流浪者·躬自厚而薄责于人 )回复于 2004-09-01 21:54:05 得分 0
搜一下以前的贴子应该有Top
3 楼loveliu0429(lovelipei)回复于 2004-09-01 22:20:43 得分 0
晕死
这种问题似乎任何一本书都有吧
估计高手对这种帖子看都不看Top
4 楼xfxf521(天使也一样)回复于 2004-09-01 22:23:42 得分 0
是的啊!!这个问题也太简单了吧!!
int i,num;
num=1;
for(i=1;i<=n;i++)
num=i*num;Top
5 楼fycom200(恋上C++)回复于 2004-09-01 22:34:25 得分 0
TO xfxf521(天使也一样) ,loveliu0429(lovelipei) :
代码呢?没代码是不给分的,结果有误也不给,之前就因问题简单而被XX删了帖。
Top
6 楼Rino(清风摇影)回复于 2004-09-01 22:37:46 得分 0
是知道N的阶乘,求N,
还是知道N,求N的阶乘?
应该可以用递归来做的。
int num;
f(int n)
{
if(n > 0)
{
if(n != 1)
{
num = num * f(n--);
}
else
num = 1;
return num;
}
else
return -1;
}Top
7 楼fycom200(恋上C++)回复于 2004-09-01 22:42:26 得分 0
求 N 的阶乘Top
8 楼loveliu0429(lovelipei)回复于 2004-09-01 22:42:38 得分 0
TO xfxf521(天使也一样) ,loveliu0429(lovelipei) :
代码呢?没代码是不给分的,结果有误也不给,之前就因问题简单而被XX删了帖。
呵呵,不给就算了,我也没办法
不过可能中了你的计了
~~~~~~~~~~
Top
9 楼Rino(清风摇影)回复于 2004-09-01 22:55:43 得分 0
突然发现自己傻的可以……Top
10 楼qwerty2004(.The best answer to WHY is WHY NOT.)回复于 2004-09-01 23:07:40 得分 1
“代码呢?没代码是不给分的,结果有误也不给”
别人来帮助你并不是为了分数
如此斤斤计较你什么也学不到
建议搜索一下以前的帖子
这样的问题出现n次了Top
11 楼yanyanyanyan(言难尽)回复于 2004-09-01 23:11:18 得分 0
恐怕没有几个人能正确解答
这个结果太大了
如果一定要答案,还是查表吧
Top
12 楼yanyanyanyan(言难尽)回复于 2004-09-01 23:15:30 得分 0
windows 自带的计算器计算阶乘好像也是查表的Top
13 楼ftkghost(小鹏)回复于 2004-09-01 23:23:16 得分 0
这个题目不简单啊 999!
谁能弄出来?
long int都存不下那么大的阿
Top
14 楼green2008(开始8年抗战!)回复于 2004-09-01 23:24:40 得分 0
main()
{ flost t=1;
int n;
for(n=1;n<=1000;n++)
{ t=t*n }
printf("t=%d",t)
}Top
15 楼green2008(开始8年抗战!)回复于 2004-09-01 23:26:50 得分 0
可以吗?我是刚学C语言的!!不熟呀!!!Top
16 楼fanbest(座天使长)回复于 2004-09-01 23:32:40 得分 3
http://community.csdn.net/Expert/topic/3320/3320760.xml?temp=.1098902
去自己找找真的这么难么?:)
好多答案都是现成滴.Top
17 楼Ardor007(阿多)回复于 2004-09-02 00:32:50 得分 0
#define N 1000
#include <stdio.h>
void main()
{
int i;
int n;
double sum;
n = N;
sum = 1.0;
for ( i = 1; i <= N; i++ )
{
sum *= i;
}
printf( "%d! = %e\n", n, sum );
}
程序编译运行出错,Floating point error:OverFlow.
然后我又用long double sum,还是不行,得到错误的值。用计算机算出来的值是4.02387260077093773543702433923e+2567,这么大的数,用一般的数据类型是根本存储不下的。这个问题的确有点难度。
不过以前已经有人讨论过了,见:
http://community.csdn.net/Expert/topic/3320/3320760.xml?temp=.1098902
Top
18 楼junmayang(笨猪)回复于 2004-09-02 08:45:35 得分 0
呵呵,我算出来了,不过结果是字符串Top
19 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-02 08:49:09 得分 0
到数据算法版去搜,怎么每个月都有人问这个问题Top
20 楼longguolin(沧海桑人)回复于 2004-09-02 09:10:36 得分 0
#include <iostream.h>
#include <conio.h>
int fact(int n);
main()
{
int m;
cout<<"Please input a number:";
cin>>m;
cout<<fact(m);
getch();
return 0;
}
int fact(int n)
{
if (n <=1)
return 1;
else
{
return n*fact(n-1);
}
}Top
21 楼rockcmc2000(很多东西不是能有你决定的,如果不能反抗,就享受吧!)回复于 2004-09-02 09:40:45 得分 0
我估计是楼主的作业。想他人帮你做而已Top
22 楼fycom200(恋上C++)回复于 2004-09-02 21:51:52 得分 0
错错错……误的理解,实话告诉大家,我是流水线上的工人,不存在作业什么的,编程是我的爱好Top
23 楼fycom200(恋上C++)回复于 2004-09-02 22:05:19 得分 0
TO qwerty2004(_sky) :
不是我斤斤计较,我是有苦难言,之前我提了一个简单的问题,在未结贴的情况下被作倒分处理了,我怕呀,到http://community.csdn.net/Expert/topic/3319/3319134.xml?temp=.5649988 支持支持我呀Top
24 楼fycom200(恋上C++)回复于 2004-09-02 22:35:13 得分 0
对了,怎么查表,结果都没计算出来到哪里去查?Top
25 楼wuyupu(wuyupu)回复于 2004-09-02 23:53:08 得分 0
# include <stdio.h>
main()
{ int sum,n,i;
sum=1;
for(i=1;i<=n;i++)
sum=sum*i;
printf("%d\n",sum);
}
这个差不多吧。Top
26 楼liujingfu123(Oh_My_GoD)回复于 2004-09-03 09:51:01 得分 3
http://community.csdn.net/Expert/topic/3197/3197510.xml?temp=6.156558E-02
这里有你要的代码!Top
27 楼fycom200(恋上C++)回复于 2004-09-03 22:11:15 得分 0
多谢各位,代码我看到了,正在学习Top
28 楼fatcat2002((我要减肥)肥猫)回复于 2004-09-07 23:08:38 得分 0
int f(int m)
{static long int f=1;
f=f*m;
return(f);
}
main()
{int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("%d!=%d\n",i,f(i));
}Top
29 楼herryhuang(Herry)回复于 2004-09-07 23:29:50 得分 0
大数计算阿,标准算法,很多的。随便搜搜看Top
30 楼beiji20081(飞鸟)回复于 2004-09-07 23:46:47 得分 0
#define N 1000
main()
{...
int s=1;
for(i=1;i<=N;i++)
s*=i;
....
}Top
31 楼telescopewyj(telescope)回复于 2004-09-08 10:38:23 得分 0
这么大的数用long long long都不可能存的下吧~~~:P
自己写高精度的大数乘法把~~Top
32 楼hongfeeling(无烟亦如烟)回复于 2004-09-10 08:55:10 得分 13
下面的是我写的计算N!的程序,用的算法是最直接的,效率不好,请高手多加指教。
在DEV-C++4.9.8.10中调试通过。测试了从3!~8!,结果正确,对于更大的阶乘未经测试
#include <stdio.h>
#define MAXLEN 4 //最大长度等于 2的(A-1) * MAXLEN次
//其中A 为arraynode 结构体中长度字段len的数据类型所占字节数
typedef int len_type;//arraynode 结构体中长度字段len的数据类型
typedef int item_type;//原数据的类型,在 void n_to_a 中使用
int maxlen =1;
typedef struct
{
len_type len; //数组长度
int * array; //元素数组指针
int flag; //0为正数,1为负数
}arraynode;
void n_to_a(item_type n,arraynode *);// 从原数据类型到数组
void arrayadd(arraynode * arr1,arraynode * arr2);//正整数相加arr1+arr2->arr1;
void arraymul(arraynode * arr1,arraynode * arr2); //正整数相减arr1*arr2->arr1
void print_largeint(arraynode * arr1);
void regular(arraynode * arr);
void delete_array(arraynode * arr);
arraynode * init(void);
main()
{
//int maxlen =1;
int n,i;
scanf("%d",&n);
maxlen = maxlen<<((sizeof(len_type)-1)*4);//存放的数据元素个数为maxlen
arraynode * arr1 = init();//存放被乘数
arraynode * arr2 = init();//存放乘数
arr1 -> len =1;
arr1 -> array[0]=1;
for(i=1;i<=n;i++)
{
n_to_a(i,arr2);
print_largeint(arr2);
arraymul(arr1,arr2);
print_largeint(arr1);
delete_array(arr2);
arr2 = init();
}//end for
print_largeint(arr1);
fflush(stdin);
getchar();
}//end main
void arraymul(arraynode * arr1,arraynode * arr2) //arr1*arr2->arr1
{
int i ,j;
arraynode * arr3 = init();
arraynode * arr4 = init();
for (i=0;i<arr2->len;i++)//乘数个数
{
for(j=0;j<arr1->len;j++)//被乘数个数
{
arr3->array[i+j]=arr2->array[i]*arr1->array[j];//根据被乘数移位
} //end for int j
arr3->len = i+j;
regular(arr3);
arrayadd(arr4,arr3);
delete_array(arr3);
arr3 = init();
}//end for i=0
arr1->len = arr4->len;
for( i=0;i<arr1->len;i++)
arr1->array[i] = arr4->array[i];
delete_array(arr4);
}
void n_to_a(item_type n,arraynode *arr)
{
item_type div=10; //存放除数
int yushu; //存放余数
if(n<0){n=-n;arr->flag=1;}//如果为负数,置标志位,将其转化为正数处理
for(;n!=0;)
{
yushu = n%10;
n/=div;
arr->array[arr->len]=yushu;//将余数赋值给第len个元素
arr->len++;
}
}//end function n_to_a
void print_largeint(arraynode *arr)
{
int i =0;
for(i=arr->len-1;i>=0;i--)
{
printf("%d",arr->array[i]);
}
printf("\n");
}
void arrayadd(arraynode * arr1,arraynode * arr2)//数组相加arr1+arr2->arr1
{
int i;
for(i=0;i<arr1->len||i<arr2->len;i++)
arr1->array[i]+=arr2->array[i];
arr1->len = arr1->len>arr2->len?arr1->len:arr2->len;
regular(arr1);
}
arraynode * init()
{
arraynode * arr = (arraynode *)malloc(sizeof(arraynode));
arr -> len = 0;
arr -> array = (int *)malloc(maxlen);
memset(arr->array,0,maxlen);
arr -> flag = 0;
return arr;
}
void delete_array(arraynode * arr)
{
free(arr->array);
free(arr);
}
void regular(arraynode * arr)
{
int i;
for(i=0;i<arr->len;i++)
{
arr->array[i+1] += arr->array[i]/10;
arr->array[i]%=10;
}
if(arr->array[i]!=0)arr->len++;
}
Top
33 楼hongfeeling(无烟亦如烟)回复于 2004-09-10 09:52:57 得分 0
稍微给了一下
#include <stdio.h>
#define MAXLEN 4 //最大长度等于 2的(A-1) * MAXLEN次
//其中A 为arraynode 结构体中长度字段len的数据类型所占字节数
typedef int len_type;//arraynode 结构体中长度字段len的数据类型
typedef int item_type;//原数据的类型,在 void n_to_a 中使用
int maxlen =1;
typedef struct
{
len_type len; //数组长度
int * array; //元素数组指针
int flag; //0为正数,1为负数
}arraynode;
void n_to_a(item_type n,arraynode *);// 从原数据类型到数组
void arrayadd(arraynode * arr1,arraynode * arr2);//正整数相加arr1+arr2->arr1;
void arraymul(arraynode * arr1,arraynode * arr2);//正整数相减arr1*arr2->arr1
void print_largeint(arraynode * arr1);//打印大整数
void regular(arraynode * arr); //归整大整数
void delete_array(arraynode * arr);//删除大整数结点
arraynode * init(void); //创建大整数结点
main()
{
//int maxlen =1;
int n,i;
scanf("%d",&n);
maxlen = maxlen<<((sizeof(len_type)-1)*4);//存放的数据元素个数为maxlen
arraynode * arr1 = init();//存放被乘数
arraynode * arr2 = init();//存放乘数
arr1 -> len =1;
arr1 -> array[0]=1;
for(i=1;i<=n;i++)
{
n_to_a(i,arr2);
// print_largeint(arr2);
arraymul(arr1,arr2);
//print_largeint(arr1);
delete_array(arr2);
arr2 = init();
}//end for
printf("%d!=",n);
print_largeint(arr1);
fflush(stdin);//清空缓冲
getchar(); //使程序停止,可以查看结果
}//end main
void arraymul(arraynode * arr1,arraynode * arr2) //arr1*arr2->arr1
{
int i ,j;
arraynode * arr3 = init();
arraynode * arr4 = init();
for (i=0;i<arr2->len;i++)//乘数个数
{
for(j=0;j<arr1->len;j++)//被乘数个数
{
arr3->array[i+j]=arr2->array[i]*arr1->array[j];//根据被乘数移位
} //end for int j
arr3->len = i+j;
regular(arr3);
arrayadd(arr4,arr3);
delete_array(arr3);
arr3 = init();
}//end for i=0
arr1->len = arr4->len;
for( i=0;i<arr1->len;i++)
arr1->array[i] = arr4->array[i];
delete_array(arr4);
}
void n_to_a(item_type n,arraynode *arr)
{
item_type div=10; //存放除数
int yushu; //存放余数
if(n<0){n=-n;arr->flag=1;}//如果为负数,置标志位,将其转化为正数处理
for(;n!=0;)
{
yushu = n%10;
n/=div;
arr->array[arr->len]=yushu;//将余数赋值给第len个元素
arr->len++;
}
}//end function n_to_a
void print_largeint(arraynode *arr)
{
int i =0;
for(i=arr->len-1;i>=0;i--)
{
printf("%d",arr->array[i]);
}
printf("\n");
}
void arrayadd(arraynode * arr1,arraynode * arr2)//数组相加arr1+arr2->arr1
{
int i;
for(i=0;i<arr1->len||i<arr2->len;i++)
arr1->array[i]+=arr2->array[i];
arr1->len = arr1->len>arr2->len?arr1->len:arr2->len;
regular(arr1);
}
arraynode * init()
{
arraynode * arr = (arraynode *)malloc(sizeof(arraynode));
arr -> len = 0;
arr -> array = (int *)malloc(maxlen);
memset(arr->array,0,maxlen);
arr -> flag = 0;
return arr;
}
void delete_array(arraynode * arr)
{
free(arr->array);
free(arr);
}
void regular(arraynode * arr)
{
int i;
for(i=0;i<arr->len;i++)
{
arr->array[i+1] += arr->array[i]/10;
arr->array[i]%=10;
}
if(arr->array[i]!=0)arr->len++;
}
Top
34 楼hongfeeling(无烟亦如烟)回复于 2004-09-15 14:23:18 得分 0
楼主给分了,我这个不好。
最近看了 一个算法它的效率比较高,我改进以后,在毒龙750上一万的阶乘只要6秒不到。
我这个程序却要120秒。Top
35 楼fycom200(恋上C++)回复于 2004-09-16 18:58:16 得分 0
问题解决了当然要给分了Top




