简单的C问题

mar*_*oln 3 c

我不得不开始学习C作为我正在做的项目的一部分.我已经开始在其中处理'euler'问题并且遇到第一个问题.我必须找到1000或以下3或5的所有倍数的总和.有人可以帮助我.谢谢.

#include<stdio.h>
int start;
int sum;

int main() {
    while (start < 1001) {
        if (start % 3 == 0) {
            sum = sum + start;
            start += 1;
        } else {
            start += 1;
        }

        if (start % 5 == 0) {
            sum = sum + start;
            start += 1;
        } else {
            start += 1;
        }
        printf("%d\n", sum);
    }
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

ram*_*ion 50

到目前为止,你已经得到了一些很好的答案,主要是建议:

#include <stdio.h>
int main(int argc, char * argv[])
{
  int i;
  int soln = 0;
  for (i = 1; i < 1000; i++)
  {
    if ((i % 3 == 0) || (i % 5 == 0))
    {
      soln += i;
    }
  }
  printf("%d\n", soln);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我要采取不同的策略.我知道你这样做是为了学习C,所以这可能有点切线.

真的,你让计算机的工作太难了:).如果我们提前想出一些事情,它可以使任务更容易.

那么,有多少3的倍数小于1000?每次有3个进入1000 - 1.

mult 3 =⌊(1000 - 1)/ 3⌋= 333

(⌊和⌋表示这是底线划分,或者,在编程术语中,整数除法,其余部分被删除).

有多少5的倍数小于1000?

mult 5 =⌊(1000 - 1)/ 5⌋= 199

现在所有3的倍数小于1000的总和是多少?

3 = 3 + 6 + 9 + ... + 996 + 999 = 3×(1 + 2 + 3 + ... + 332 + 333)= 3×Σi = 1到mult 3 i

并且所有5的倍数的总和小于1000?

5 = 5 + 10 + 15 + ... + 990 + 995 = 5×(1 + 2 + 3 + ... + 198 + 199)= 5×Σi = 1到mult 5 i

3的倍数也是5的倍数.这些是15的倍数.因为那些计数到mult 3和mult 5(因此总和35)我们需要知道mult 15和sum 15以避免计算它们两次.

mult 15 =⌊(1000 - 1)/ 15⌋= 66

15 = 15 + 30 + 45 + ... + 975 + 990 = 15×(1 + 2 + 3 + ... + 65 + 66)= 15×Σi = 1到mult 15 i

因此,解决问题的方法是" 找到所有3或5的倍数之和低于1000 "

soln = sum 3 + sum 5 - sum 15

所以,如果我们想,我们可以直接实现:

#include <stdio.h>
int main(int argc, char * argv[])
{
  int i;
  int const mult3 = (1000 - 1) / 3;
  int const mult5 = (1000 - 1) / 5;
  int const mult15 = (1000 - 1) / 15;
  int sum3 = 0;
  int sum5 = 0;
  int sum15 = 0;
  int soln;

  for (i = 1; i <= mult3; i++) { sum3 += 3*i; }
  for (i = 1; i <= mult5; i++) { sum5 += 5*i; }
  for (i = 1; i <= mult15; i++) { sum15 += 15*i; }

  soln = sum3 + sum5 - sum15;
  printf("%d\n", soln);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我们可以做得更好.为了计算单个和,我们有高斯的同一性,它表示从1到n的总和(又名Σi = 1到n i)是n×(n + 1)/ 2,所以:

3 = 3×mult 3 ×(mult 3 +1)/ 2

5 = 5×mult 5 ×(mult 5 +1)/ 2

15 = 15×mult 15 ×(mult 15 +1)/ 2

(注意,我们可以在这里使用正常除法或整数除法 - 因为n或n + 1中的一个必须可被2整除,所以无关紧要)

现在这有点整洁,因为这意味着我们可以在不使用循环的情况下找到解决方案:

#include <stdio.h>
int main(int argc, char *argv[])
{
  int const mult3 = (1000 - 1) / 3;
  int const mult5 = (1000 - 1) / 5;
  int const mult15 = (1000 - 1) / 15;
  int const sum3 = (3 * mult3 * (mult3 + 1)) / 2;
  int const sum5 = (5 * mult5 * (mult5 + 1)) / 2;
  int const sum15 = (15 * mult15 * (mult15 + 1)) / 2;

  int const soln = sum3 + sum5 - sum15;
  printf("%d\n", soln);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,既然我们已经走了这么远,我们可以手工制作整个事情:

3 = 3×333×(333 + 1)/ 2 = 999×334/2 = 999×117 = 117000 - 117 = 116883

5 = 5×199×(199 + 1)/ 2 = 995×200/2 = 995×100 = 99500

15 = 15×66×(66 + 1)/ 2 = 990×67/2 = 495×67 = 33165

soln = 116883 + 99500 - 33165 = 233168

写一个更简单的程序:

#include <stdio.h>
int main(int argc, char *argv[])
{
  printf("233168\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Fab*_*der 17

你可以改变你的ifs:

 if  ((start % 3 == 0) || (start % 5 == 0)) 
     sum += start;
 start ++;
Run Code Online (Sandbox Code Playgroud)

并且不要忘记用零初始化你的总和并从一开始.另外,将while条件更改为<1000.


ant*_*ony 6

你可以通过for循环更好地服务,并结合你的条件.

未经测试:

int main()
{
  int x;
  int sum = 0;

  for (x = 1; x <= 1000; x++)
    if (x % 3 == 0 || x % 5 == 0)
      sum += x;

  printf("%d\n", sum);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)