C编程为什么我的代码不工作?

时间:2013-04-25 06:50:59

标签: c

所以,我必须编写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时,结果是9,它应该是3.我做错了什么?

6 个答案:

答案 0 :(得分: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;    
}

以下我总是n+1p始终为1,因此您实际上有效i+i+i... n次

for (j=1;j<=i;j++)
{
   s=s+(p*i);
}

答案 1 :(得分:0)

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

答案 2 :(得分: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; }的正文也会在每次迭代时为p分配1。这不是我想要的。
  • 我建议你自己试一试纸和笔​​,然后在你的程序中找一步,看看每一步都发生了什么。在尝试用C语言编写之前,您应该已经在纸上设计了算法。

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

enter image description here

在第二行,如果你保留prev = n!,你会看到在for循环中你可以通过这样做来优化事实(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
}

答案 3 :(得分: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计算阶乘,因为我们可以从阶乘(n - 1)得到阶乘(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;
}

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

答案 4 :(得分: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循环仅用于整个事情会使事情变得混乱。

答案 5 :(得分: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;
}