2013-04-25 81 views
-2

所以,我必须写一个S=1+1*2+1*2*3+1*2*3*4+..n!的代码,其中n由用户给出。 我写了这个代码C编程为什么我的代码不工作?

#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.什么我做错了?

+8

'为(I = 1;我<= N;我++); ' - 删除';' – 2013-04-25 06:53:23

+2

请正确缩进您的代码。 – RedX 2013-04-25 06:53:27

+3

'for(i = 1; i <= n; i ++);'现在这是一个冗长的说'i = n + 1'的方式 – msam 2013-04-25 06:55:21

回答

0

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

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.

对于优化前,这里是你的数学问题:

enter image description here

二号线,如果你一直prev = n!,你就会发现在你的for循环,你可以通过做优化其实(我):

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 
} 
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)(N - 1)。所以:

#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; 
} 

此外,你应该做的更好的代码风格和命名约定。

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循环才会使事情变得混乱。

+2

你的程序的缩进很丑陋:-) – Jens 2013-04-25 08:16:08

+0

@Jens OK,格式化它。但是我必须为每一行手动执行它。你知道如何在文本编辑器中一次自动格式化整个程序吗?知道“代码示例”选项,它简单地将所选文本突出显示为代码。如何一次格式化整个事物? – 2013-04-25 15:53:30

+0

谢谢。我建议** GNU indent **在您的计算机上缩进代码然后粘贴它。编辑窗格对于特定的编程语言没有缩进功能。 – Jens 2013-04-25 15:56:00

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; 
} 
+1

所以我复制你的代码,在海湾合作委员会编译,称为'时间a.out'并给了999999的输入,去卫生间,回来,去喝一杯,回来,然后按CTRL + C,结果仍然正在计算,然后再次被称为'.a.out'现在给了输入' 把一个数字:d sum = -125961703' :)(只是开个玩笑,代码对于正常输入和很好的逻辑都很好) – abasu 2013-04-25 07:22:27

+0

太糟糕了他给出了阶乘代码..我想这是作业的主题。 – Gui13 2013-04-25 07:31:30

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+1p始终为1,所以你有效做i+i+i... n次

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