回 帖 发 新 帖 刷新版面

主题:请高手指教

我编写了一个求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个回复)

沙发

scanf("%d\n",&a) 这句里不应该有\n; \n这个一般是输出时换行才用的

板凳

好了!呵呵,谢谢哦!

3 楼

嗯,我也是个初学者···过来交流,不敢说指点··
这个是我写的求阶乘的程序,不妨看一下吧
/* 阶乘 */
#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 楼


呵呵。您太谦虚啦!你这个程序太好了,我差点没看明白!是啊!我们老师也说过,可我就不知道是啥意思?你能给我解释一下吗?我该怎么做才能做到这一点呢?感激不尽!!![em12]

5 楼


  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 楼

#define MAX 100// 乘到多少

for( int i = 0;i < MAX;i++ )
{
    ...........
}

7 楼


#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 楼

[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 楼

哦!谢谢指教哦!但是应该怎么作才算更好呢?请您不吝赐教!!!谢谢![em12]

10 楼

彼岸的很简明了。其实思路很清晰了
循环做阶乘就是从头开始,从1到n
递归就是从尾巴开始,从n到1
至于你为什么要一次乘两个,我就不太明白了

我来回复

您尚未登录,请登录后再回复。点此登录或注册