所以,我必须编写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.我做错了什么?
答案 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+1
且p
始终为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;
;我不认为那是你想做的事情{ p=1; }
的正文也会在每次迭代时为p
分配1。这不是我想要的。为了优化,这是你的数学问题:
在第二行,如果你保留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;
}