我想用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);

最佳答案

在做


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+2101+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),我们也可以不循环地计算期望值。


我们知道1+2+3+...+nn*(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


工程!

关于c - 从101到201的奇数和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55578080/

10-11 19:31