我三天前才开始编程,而且我一直在使用Javascript。我一直在努力解决Project Euler Problem 1:
查找低于1000的3或5的所有倍数的总和。
我觉得我的程序应该可行,但我的答案仍然略有偏差。谁能告诉我我的代码有什么问题?
var threeSum = [];
var threeTotal = 0;
var fiveSum = [];
var fiveTotal = 0;
for (i = 0; i < 1000; i += 3) {
threeSum.push(i);
}
for (j = 0; j < threeSum.length; j++) {
threeTotal = threeTotal + threeSum[j];
}
for (a = 0; a < 1000; a += 5) {
fiveSum.push(a);
}
for (r = 0; r < fiveSum.length; r++) {
fiveTotal = fiveTotal + fiveSum[r];
}
console.log(threeTotal + fiveTotal);
当我运行这个程序时,我得到了266333的答案。
答案 0 :(得分:2)
答案 1 :(得分:0)
如果我们列出10以下的所有自然数,它们是3或3的倍数 5,我们得到3,5,6和9.这些倍数的总和是23.找到 所有3或5的倍数的总和低于1000。
由于您正在学习,我假设您不希望得到明确的答案。
想想你的总结。 3循环的前几个术语是
[3, 6, 9, 12, 15]
和5循环的前几个术语是
[5, 10, 15]
由于你计算两次3和5的倍数,你的答案大于应该
答案 2 :(得分:0)
旁注 - 编程通常也意味着搜索非显而易见的解决方案。问题的措辞建议将数字从1到999循环,但是通过一些数学计算,根本不需要循环,你可以解决n = 1.000.000.000的问题,与n = 10一样快(如果没有溢出)
var n = 1000;
var multiplesOfThree = Math.floor((n - 1) / 3);
var multiplesOfFive = Math.floor((n - 1) / 5);
var multiplesOfThreeAndFive = Math.floor((n - 1) / 15);
var sum = 3 * multiplesOfThree * (multiplesOfThree + 1) / 2
+ 5 * multiplesOfFive * (multiplesOfFive + 1) / 2
- 15 * multiplesOfThreeAndFive * (multiplesOfThreeAndFive + 1) / 2;
答案 3 :(得分:0)
this is pretty much how I did it and I get the right answer.
`var threeSum=0;`
var fiveSum=0;
var dSum=0;
for (var b=3; b<1000; b++) {
if (b%3===0) {
threeSum=threeSum+b;
}
}
for (var c=5; c<1000; c++) {
if (c%5===0) {
fiveSum=fiveSum+c;
}
}
for (var d=15; d<1000; d++) {
if (d%15===0) {
dSum=dSum+d;
}
}
console.log((threeSum+threeSum)-dSum);
答案 4 :(得分:0)
这是我对Project Euler 1st问题的解决方案,简单且易于理解。它在java中,但可以很容易地翻译成任何语言
public class Multiples {
public static int multiplesSum(int n1, int n2, int limit) {
int sum = 0;
int n = Math.min(n1, n2);
for(int i=n; i<limit; i++) {
if(i%n1==0 || i%n2==0) {
sum+=i;
}
}
return sum;
}
public static void main(String[] args) {
int total = multiplesSum(3,5,1000);
System.out.println("Total sum is: " + total);
}
}
这是项目欧拉专家建议的最佳解决方案:
/**
* Remember that the sum of the first n natural numbers is: n(n+1)/2
*
* Let’s look at the details of our function and take as example n=3.
We would have to add:
3+6+9+12+......+999=3*(1+2+3+4+...+333)
For n=5 we would get:
5+10+15+...+995=5*(1+2+....+199)
Now note that 199=995/5 but also 999/5 rounded down to the nearest integer.
*
* @param n
* @param limit
* @return
*/
public static int multiplesSumOf(int n, int limit) {
int target = (limit-1)/n;
return n * target*(target+1)/2;
}
public static void main(String[] args) {
int total = multiplesSumOf(3,1000) + multiplesSumOf(5,1000) - multiplesSumOf(15,1000);
System.out.println("Total: " + total);
}
答案 5 :(得分:0)
var num = 1000
var numbers = []
for(var i = 0; i < num; i++){
if( i % 3 === 0|| i % 5 === 0){
numbers.push(i)
}
};
var sum = numbers.reduce((a, b) => a + b, 0);
答案 6 :(得分:0)
我在这里使用Kotlin发布了我的解决方案: https://github.com/moxi/project-euler-solutions/blob/master/code/src/main/kotlin/org/rcgonzalezf/onetoten/Problem1.kt 关于Kotlin以及为什么我在这里发帖的好处是它们也支持JavaScript编译(转换),所以你可能会发现它很有趣:https://kotlinlang.org/docs/tutorials/javascript/kotlin-to-javascript/kotlin-to-javascript.html
fun solve(baseNumber: Int): Int {
return (0..baseNumber - 1)
.filter { it % 3 == 0 || it % 5 == 0 }
.sum()
}
正如你所看到的那样非常简洁,我将尝试解决一些Euler Project问题在LiveEdu上流式传输我觉得它很有趣,我不想在这里粘贴链接,因为这不是广告平台,如果你想讨论它在那里搜索项目欧拉。