主题:请高手指教
yaoyinglong
[专家分:0] 发布于 2010-04-16 13:15:00
我编写了一个求n!的程序:
#include <stdio.h>
main()
{
int a,t=1;
float i=1.0,j;
scanf("%d\n",&a);
j=a/2;
while (i<=j)
{
t=t*a*(a-1);
i++;
a=a-2;
}
printf("n! is :%d\n",t);
}
为什么要输两个数字才能算出结果。而且算的是第一个数的阶乘?我的结果是:
5
4
n! is :120
请高手指教。谢谢!!
回复列表 (共10个回复)
沙发
耶路撒冷 [专家分:650] 发布于 2010-04-16 13:41:00
scanf("%d\n",&a) 这句里不应该有\n; \n这个一般是输出时换行才用的
板凳
yaoyinglong [专家分:0] 发布于 2010-04-16 21:19:00
好了!呵呵,谢谢哦!
3 楼
彼岸之歌 [专家分:50] 发布于 2010-04-16 21:42:00
嗯,我也是个初学者···过来交流,不敢说指点··
这个是我写的求阶乘的程序,不妨看一下吧
/* 阶乘 */
#include "stdio.h"
void main()
{
int n,i=1;
long fac=1;
printf("Please input n:\n");
scanf("%ld",&n);
while(i<=n)
{
fac=fac*i;
i++;
}
printf("n! =% ld\n",fac);
}
另外,其实求阶乘可以有很多种求法的,用循环语句可以,嗯,如果学了递归,用递归调用也可以的。我觉得对一个问题尝试用多种解决方法是很好的。
看了你的程序,有一点要说的,我们老师跟我们强调说,一个好的程序,要有好的人机交互性,我现在是按照老师说的在做的。
4 楼
yaoyinglong [专家分:0] 发布于 2010-04-16 22:30:00
呵呵。您太谦虚啦!你这个程序太好了,我差点没看明白!是啊!我们老师也说过,可我就不知道是啥意思?你能给我解释一下吗?我该怎么做才能做到这一点呢?感激不尽!!![em12]
5 楼
彼岸之歌 [专家分:50] 发布于 2010-04-16 23:09:00
while(i<=n)
{
fac=fac*i;
i++;
}
这段是一个循环语句,因为我之前用
int n,i=1;
long fac=1;
给i,fac都赋了初值1,所以你输入n后,比如n等于5,那么循环语句的循环条件i<=n成立,进入循环体,首先,fac=fac*i;这样fac还是1;下一步,i自增,变为2,仍然小于5,于是继续循环,这样,fac由1变为1*2,再循环变为1*2*3······直到变为1*2*3*4*5····不知道会不会讲的太罗嗦了
嗯,我的做法,是从1开始1*2*···*n,而你则是从n开始往小的乘,这就是我们的不同吧······
另外,人机交互性,就是说程序在运行时能告诉你要做什么,让你能根据提示来做出正确的相应的操作,比如你的程序,换一个根本不知道你源程序的人来执行编译后的.exe文件,没有提示信息,他根本就不知道要干嘛。而我的, printf("Please input n:\n"); 就能在运行时输出一条提示信息,告你你,哦,要我输入一个数啊。然后结束的时候,printf("n! =% ld\n",fac); 的作用,如果你输入5,结果就是
5!= 120
一看就知道是求阶乘的。我的解释就是这样了···也不知道有没有说清楚···
···要的话,加个好友吧,我QQ564539492,呵呵[em2]
6 楼
BruCe07 [专家分:0] 发布于 2010-04-17 04:47:00
#define MAX 100// 乘到多少
for( int i = 0;i < MAX;i++ )
{
...........
}
7 楼
ccai [专家分:0] 发布于 2010-04-18 19:55:00
#include <stdio.h>
main()
{
int a,t=1;
int j;
float i=1.0;
scanf ("%d",&a);
j=a/2;
while (i<=j)
{
t=t*a*(a-1);
i++;
a=a-2;
}
printf("n! is :%d\n",t);
}
这样应该对了
8 楼
雪光风剑 [专家分:27190] 发布于 2010-04-18 20:13:00
[quote]
#include <stdio.h>
main()
{
int a,t=1;
int j;
float i=1.0;
scanf ("%d",&a);
j=a/2;
while (i<=j)
{
t=t*a*(a-1);
i++;
a=a-2;
}
printf("n! is :%d\n",t);
}
这样应该对了[/quote]
这样做第一,绕了很大一个弯子,循环次数没必要这样化简,第二,i应该声明成int型为什么要用float
9 楼
yaoyinglong [专家分:0] 发布于 2010-04-18 22:30:00
哦!谢谢指教哦!但是应该怎么作才算更好呢?请您不吝赐教!!!谢谢![em12]
10 楼
雪光风剑 [专家分:27190] 发布于 2010-04-19 07:57:00
彼岸的很简明了。其实思路很清晰了
循环做阶乘就是从头开始,从1到n
递归就是从尾巴开始,从n到1
至于你为什么要一次乘两个,我就不太明白了
我来回复