我不得不开始学习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(因此总和3和5)我们需要知道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.
你可以通过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)
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |