-2

S=1+1*2+1*2*3+1*2*3*4+..n!因此,我必须为用户给出 n 的位置编写代码。我写了这段代码

#include <stdio.h>
int main (void)
{
    int i, n, j, s, p;
    printf("Put a number:");
    scanf("%d",&n);
    s = 0;

    for (i = 1; i <= n; i++);    
    {
     p=1;    
    }

   for (j=1;j<=i;j++)
   {
       s=s+(p*i);
   }
   printf("\n Sum=%d",s);
   return 0;
}

它可以编译,但是当我运行它并输入例如:2,结果应该是 3 时是 9。我做错了什么?

4

6 回答 6

1

这就是你需要的

int f = 1;
int s = 0;
for (i = 1;i <= n;i++)
{     
    f *= i;
    s += f;
}

但我建议您使用调试器查看自己的代码,以了解事情是如何工作的

编辑:

for (i=1;i<=n;i++);相当于i = n+1

这里的块没用,你只是将 p 设置为 1;

{
 p=1;    
}

在下面 i 总是n+1并且p总是 1,所以你有效地做i+i+i...了 n 次

for (j=1;j<=i;j++)
{
   s=s+(p*i);
}
于 2013-04-25T07:36:25.467 回答
0

这 ; 在第一个“for”结束语句之后,这是一个空循环。此外,第二个循环应该在第一个循环内,而不是。缩进代码不仅仅是装饰性的——它可以帮助澄清这样的代码。

于 2013-04-25T06:56:12.650 回答
0

我建议您先编写一个计算阶乘(n)的函数,然后在循环中使用该函数。

会更容易理解。

int fact( int n) {
   // do your factorial compututation
}

int n = 0, sum = 0;

scanf("%d", &n);

for( int i = 0; i<n; i++) 
{
   sum += fact(i);
}

您提供的代码有几个缺陷:

  • for (i=1;i<=n;i++);只是在做i = n;;我不认为那是你想要做的
  • 即使这个循环是正确的,你的 for 的主体也会在每次迭代{ p=1; }时分配 1 。p我认为这也不是你想要的。
  • 我建议自己尝试一下,拿一张纸和一支笔,在你的程序中一步一步来看看每一步发生了什么。在尝试用 C 编写算法之前,您应该在纸上设计算法。

为了优化,这是你的数学问题:

在此处输入图像描述

在第二行,如果你保留prev = n!,你会看到在你的 for 循环中,你可以通过执行以下操作来优化 fact(i) :

int prev = 1;
int sum = 0;
for( int i = 1; i<n; i++) // start at 1 to skip the first iteration where 0! = 1
{
   sum += prev;
   prev = prev * i; // compute next factorial
}
于 2013-04-25T06:56:46.277 回答
0

这是该程序背后的主要逻辑Use a recursive function to calculate the factorial of n,and use this within a for loop to calculate the summation for all values between 1 and n

#include<stdio.h>

int factorial(int);

int main(void)
  {
   int i,n,s;
   printf("Put a number:");
   scanf("%d",&n);
   s=0;

     for(i=1;i<=n;i++)
     {
       s+=factorial(i);
     }
  printf("\n Sum=%d",s);

  }

int factorial(int x)
  {

    if(x==1)
    return 1;    
    return x*factorial(x-1);

  }

在您的程序中,以下代码完全没有任何用途:

for (i=1;i<=n;i++);    
    {
     p=1;    
    }

此外,您不需要这么多变量来完成这项工作。使用递归使其变得更加简单和优雅,如果您这样做是为了完成作业,如果您能以更聪明的方式完成,您可以给老师留下更多印象。使用for循环只有整件事才会把事情弄得一团糟。

于 2013-04-25T07:08:39.670 回答
0

基本上一切都错了:-)

#include <stdio.h>

int factorial(int n)
{
    int i, res = 1;

    for(i = 2; i <= n; i++)
        res *= i;

    return res;
}

int main(void)
{
    int i, n, s = 0;
    printf("Put a number:");
    scanf("%d", &n);
    s = 0;
    for (i = 1; i <= n; i++)
        s += factorial(i);

    printf("\n Sum=%d\n", s);
    return 0;
}
于 2013-04-25T07:09:42.317 回答
0

我认为基本上它需要两个循环,一个用于添加阶乘值,一个用于计算阶乘的内部循环。

#include <stdio.h>
int main (){
        int i,n,j,sum,factorial;
        printf("Put a number:");
        scanf("%d",&n);
        sum = 0;
        for (i=1;i<=n;i++){
                factorial = 1;
                for (j=2;j<=i;j++){
                        factorial *= j;
                }
                sum += factorial;
        }
        printf("\nSum=%d\n",sum);
        return 0;
}

但是我们可以发现,我们不需要每次都从 1 开始计算阶乘,因为我们可以从 factorial(n - 1) 得到 factorial(n)。所以:

#include <stdio.h>
int main (){
        int i,n,j,sum,factorial;
        printf("Put a number:");
        scanf("%d",&n);
        sum = 0;
        factorial = 1;
        for (i=1;i<=n;i++){
                factorial *= i;
                sum += factorial;
        }
        printf("\nSum=%d\n",sum);
        return 0;
}

此外,您应该在代码样式和命名约定方面做得更好。

于 2013-04-25T07:02:16.680 回答