我想用C编写一个程序,该程序将打印从101到201的所有奇数之和。请帮忙。
int i,t,s;
i=101;
s=0;
while(i<=201)
{
t=i+2;
s=s+t;
i+=2;
}
printf("sum is %d",s);
答案 0 :(得分:1)
做
int i,t,s; i=101; s=0; while(i<=201) { t=i+2; s=s+t; i+=2; } printf("sum is %d",s);
您求和的第一个值为i+2
为101+2
为103,因此您错过了加101的操作
当然可以通过101而不是0来纠正它,以初始化 s ,但是可以简化代码并使代码更具可读性,例如:
int s = 0;
for (int i = 101; i <= 201; i += 2)
s += i;
但是类似的序列可以有一个公式
我们希望101+103+105+...+201
是(1+3+5+...+201)
-(1+3+5+...+99)
,所以如果我们知道如何不循环地计算1+3+5+...+(2*n+1)
,我们也可以不循环地计算期望值。 / p>
我们知道1+2+3+...+n
是n*(n+1)/2
我们实际上想要1+2+3+4+...+(2*m+1) - (2+4+6+8+...+(2*m))
具有2+4+6+8+...+(2*m)
的是2*(1+2+3+...+m)
最终1+3+5+...+(2*m+1)
是(2*m+1)*(2*m+2)/2 - 2*m*(m+1)/2
因此,要计算2个奇数值(此处为101和201)之间的值,程序可以是:
#include <stdio.h>
int sumOdd(int m)
{
m /= 2; /* m in my formula */
return (2*m+1)*(2*m+2)/2 - 2*m*(m+1)/2;
}
int main(int argc, char ** argv)
{
int n1, n2;
if (argc != 3)
printf("Usage: %s <odd1> <odd2>", *argv);
else if ((sscanf(argv[1], "%d", &n1) != 1) ||
(sscanf(argv[2], "%d", &n2) != 1) ||
(n1 < 1) ||
((n2 - n1) < 2) ||
((n1 & n2 & 1) != 1))
fprintf(stderr, "wrong values %d %d\n", n1, n2);
else
printf("%d\n", sumOdd(n2) - sumOdd(n1 - 2));
/* use the loop to check the formula result */
int s = 0;
for (int i = n1; i <= n2; i += 2)
s += i;
printf("%d\n", s);
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wall -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out 101 201
7701
7701
工程!
答案 1 :(得分:0)
不需要变量t
-只需将i
添加到s
。喜欢
int i,s;
i=101;
s=0;
while(i<=201)
{
s=s+i;
i+=2;
}
printf("sum is %d",s);