如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23。 我有以下代码,但答案不符。
#include<stdio.h>
int main()
{
long unsigned int i,sum=0;
clrscr();
for(i=0;i<=1000;i++)
{
if((i%5==0)||(i%3==0))
{
sum=sum+1;
}
}
printf("%d\n",sum);
getchar();
return 0;
}
答案 0 :(得分:19)
与其使用基于范围/循环的解决方案相比,您可能希望利用更多的数学而不是暴力。
有一种简单的方法可以得到一个数的倍数之和,小于一个数。
例如,3到1000的倍数之和为:3 + 6 + 9 + ... + 999 可以改写为:3 *(1 + 2 + 3 + ... + 333)
有一种简单的方法可以总结所有数字1-N:
Sum(1,N) = N*(N+1)/2
所以样本函数将是
unsigned int unitSum(unsigned int n)
{
return (n*(n+1))/2;
}
所以现在将所有3的倍数小于1000(也就是999)减少到:
3*unitSum((int)(999/3))
您可以对5的倍数执行相同的操作:
5*unitSum((int)(999/5))
但有一点需要注意!这两个都计算了两者的倍数,如15,30等 它计算两次,每次一个。所以为了平衡这一点,你减去一次。
15*unitSum((int)(999/15))
总的来说,等式是:
sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))
所以现在而不是循环遍历大量数字,并进行比较,你只是做一些简单的乘法!
答案 1 :(得分:18)
两件事:
将循环更改为
for(i=0;i<1000;i++)
总和为
sum=sum+i;
答案 2 :(得分:7)
也许你应该做
sum += i // or sum = sum + i
而不是
sum = sum + 1
此外,使用printf打印long unsigned int
时要小心。我想正确的说明符是%lu
。
答案 3 :(得分:6)
应该是sum = sum + i
而不是1
。
答案 4 :(得分:3)
#include<stdio.h>
#include<time.h>
int main()
{
int x,y,n;
int sum=0;
printf("enter the valeus of x,y and z\n");
scanf("%d%d%d",&x,&y,&n);
printf("entered valeus of x=%d,y=%d and z=%d\n",x,y,n);
sum=x*((n/x)*((n/x)+1)/2)+y*((n/y)*((n/y)+1)/2)-x*y*(n/(x*y))*((n/(x*y))+1)/2;
printf("sum is %d\n",sum);
return 0;
}
// give x,y and n as 3 5 and 1000
答案 5 :(得分:2)
这是一个蟒蛇单行,给出了正确的答案(233168):
reduce( lambda x,y: x+y, [ x for x in range(1000) if x/3.0 == int( x/3.0 ) or x/5.0 == int( x/5.0 ) ] )
答案 6 :(得分:2)
正如改进一样,您可能希望完全避免循环:
multiples of 3 below 1000 form an AP : 3k where k in [1, 333]
multiples of 5 below 1000 form an AP : 5k where k in [1, 199]
如果我们避免3和5的倍数:15k,其中k为[1,66]
So the answer is : 333*(3+999)/2 + 199(5+995)/2 - 66*(15+990)/2 = 2331
68
为什么你可能想要这样做是由你去弄明白的。
答案 7 :(得分:2)
这两种方法之间时间差异的有趣事实......第二种方法只计算所需的数字并且不迭代循环。 示例:3 *(1 + 2 + 3 + 4 ... 333)(因为3 * 333 = 999和999 <1000。
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
Calc calculator = new Calc();
long target = 999999999;
sw.Start();
Console.WriteLine("Result: " + (calculator.calcMultipleSumFast(3,target) + calculator.calcMultipleSumFast(5, target) - calculator.calcMultipleSumFast(15, target)));
sw.Stop();
Console.WriteLine("Runtime: " + sw.Elapsed);
Console.WriteLine();
sw.Start();
Console.WriteLine("Result: " + (calculator.calcMultiplesSum(3, 5,1000000000)));
sw.Stop();
Console.WriteLine("Runtime: " + sw.Elapsed);
Console.ReadKey();
}
public class Calc
{
public long calcMultiplesSum(long n1, long n2, long rangeMax)
{
long sum = 0;
for (long i = 0; i < rangeMax; i++)
{
if ((i % n1 == 0) || (i % n2 == 0))
{
sum = sum + i;
}
}
return sum;
}
public long calcMultipleSumFast(long n, long rangeMax)
{
long p = rangeMax / n;
return (n * (p * (p + 1))) / 2;
}
}
答案 8 :(得分:0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i,sum=0; //initialize sum with 0
for(i=0;i<1000;i++) //run loop from 0 999 (1000 is not included) because
//we want less than 1000.
{
if(i%5==0||i%3==0) //check if it satisfy one of the
//condition either
//it divides with 5 or 3 completely
//i.e remainder0
{
sum+=i; //increment sum by that number as
//particular number
//satisfy the condition
}
}
cout<<sum; //print sum the value of sum
return 0;
}
答案 9 :(得分:0)
我尝试了欧拉1号项目:3和5的倍数。为此获得了60分。
private static long euler1(long N) {
long i, sum = 0;
for (i = 3; i < N; i++) {
if (i % 3 == 0 || i % 5 == 0) {
sum += i;
}
}
return sum;
}
我使用Java,并且可以将这种逻辑用于C。我努力工作并找到了最佳解决方案。
private static void euler1(long n) {
long a = 0, b = 0, d = 0;
a = (n - 1) / 3;
b = (n - 1) / 5;
d = (n - 1) / 15;
long sum3 = 3 * a * (a + 1) / 2;
long sum5 = 5 * b * (b + 1) / 2;
long sum15 = 15 * d * (d + 1) / 2;
long c = sum3 + sum5 - sum15;
System.out.println(c);
}
答案 10 :(得分:0)
以声明方式思考-您想做什么,而不是想怎么做。
简而言之,它可以归结为问题要求您执行的操作:
在LINQ中,它看起来像:
Enumerable.Range(1, 1000)
.Where(x => (x % 3 == 0) || (x % 5 == 0))
.Aggregate((accumulate, next) => accumulate += next);
现在,您可以将其转换为迭代解决方案-但使用上述声明式解决方案没有任何问题-因为它更清晰,简洁。
答案 11 :(得分:0)
int main(int argc, char** argv)
{
unsigned int count = 0;
for(int i = 1; i < 1001; ++i)
if(!(i % 3) && !(i % 5))
count += i;
std::cout << i;
return 0;
}
答案 12 :(得分:0)
使用步进方法,您可以制作一个版本:
#include <stdio.h>
int main ( void ) {
int sum = 0;
for (int i = 0; i < 1000; i += 5) {
sum += i;
}
for (int i = 0; i < 1000; i += 3) {
if (i % 5) sum += i; /* already counted */
}
printf("%d\n", sum);
return 0;
}
可以减少modulo
次计算。
事实上,使用计数器,您可以创建一个没有的版本:
#include <stdio.h>
int main ( void ) {
int sum = 0;
int cnt = 6;
for (int i = 0; i < 1000; i += 5) {
sum += i;
}
for (int i = 0; i < 1000; i += 3) {
if (--cnt == 0) cnt = 5;
else sum += i;
}
printf("%d\n", sum);
return 0;
}
答案 13 :(得分:0)
int Sum(int N) {
long long c = 0;
N--; //because you want it less than 1000 if less than or equal delete this line
int n = N/3,b = N/5,u = N/15;
c+= (n*(n+1))/2 * 3;
c+= (b*(b+1))/2 * 5;
c-= (u*(u+1))/2 * 15;
return c;
}
答案 14 :(得分:0)
Python实现的问题。短,精确,肥胖。
sum=0
for i in range(1000):
if (i%3==0) or (i%5==0):
sum=sum+i
print sum
答案 15 :(得分:0)
您可以从3
(3,6,9,12等)开始,从1000
迭代到3
,然后将它们添加到sum
之类的,
int i = 3, sum = 0;
for (; i < 1000; i += 3) {
sum += i;
}
然后你可以5
从1000
迭代到5
(跳过3
的倍数,因为它们已被添加)将这些值添加到{{1还有
sum
然后显示for (i = 5; i < 1000; i += 5) {
if (i % 3 != 0) sum += i;
}
sum
答案 16 :(得分:-1)
package com.venkat.test;
public class CodeChallenge {
public static void main(String[] args) {
int j, sum=0;
for ( j = 0; j <=1000; j++) {
if((j%5==0)||(j%3==0))
{
sum=sum+j;
}
}
System.out.println(sum);
}
}