找到低于1000的3和5的倍数之和

时间:2013-10-30 19:13:18

标签: java

好的伙计们,所以我正在进行欧拉计划的挑战,我无法相信我被first challenge所困扰。尽管我的代码看起来很实用,但我真的不明白为什么我得错了答案:

import java.util.ArrayList;


public class Multithree {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Integer> x = new ArrayList<Integer>();
        ArrayList<Integer> y = new ArrayList<Integer>();
        int totalforthree = 0;
        int totalforfive = 0;

        int total =0;

        for(int temp =0; temp < 1000 ; temp++){
            if(temp % 3 == 0){
                x.add(temp);
                totalforthree += temp;
            }
        }

        for(int temp =0; temp < 1000 ; temp++){
            if(temp % 5 == 0){
                y.add(temp);
                totalforfive += temp;
            }
        }

        total = totalforfive + totalforthree;



        System.out.println("The multiples of 3 or 5 up to 1000 are: " +total);

    }

}

我得到答案为266333,它说它错了......

13 个答案:

答案 0 :(得分:13)

你应该为两者使用相同的for循环,以避免重复计算两者的倍数。比如15,30 ......

   for(int temp =0; temp < 1000 ; temp++){
        if(temp % 3 == 0){
            x.add(temp);
            totalforthree += temp;
        }else if(temp % 5 == 0){
            y.add(temp);
            totalforfive += temp;
        }
    }

答案 1 :(得分:3)

如果您使用的是Java 8,则可以通过以下方式执行此操作:

Integer sum = IntStream.range(1, 1000) // create range
                  .filter(i -> i % 3 == 0 || i % 5 == 0) // filter out
                  .sum(); // output: 233168

要计算两次35可以分割的数字 要么两次写上面的行,要么.map() 2 * i值:

Integer sum = IntStream.range(1, 1000)
                  .filter(i -> i % 3 == 0 || i % 5 == 0)
                  .map(i -> i % 3 == 0 && i % 5 == 0 ? 2 * i : i)
                  .sum(); // output: 266333

答案 2 :(得分:1)

从数学角度讲,
您没有考虑3到5之间的共同因素。
因为存在重复计算。


ex; 15号 30岁 45岁 60岁 75, 90岁 105, 120, 135, 150, 165, 180 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345, 360 375, 390, 405, 420, 435, 450, 465, 480, 495, 510, 525, 540, 555, 570, 585, 600, 615, 630, 645, 660, 675, 690, 705, 720, 735, 750, 765, 780, 795, 810, 825, 840, 855, 870, 885, 900, 915, 930, 945, 960年 975, 990是常见因素。

公因数总计= 33165。
您的回答是266333
正确答案是233168。
您的答案-共同因素总计
266333-33165 = 233168。

(这是用于获取公因子和公因子总数的代码)

public static void main(String[] args) {

System.out.println("The sum of the Common Factors : " + getCommonFactorSum());

}

private static int getCommonFactorSum() {
int sum = 0;
for (int i = 1; i < 1000; i++) {
    if (i % 3 == 0 && i % 5 == 0) {
        sum += i;
        System.out.println(i);
    }
}

答案 3 :(得分:0)

你们不是都认为不是使用循环计算倍数之和,而是使用简单的formula of Arithmetic Progression to compute sum of n terms轻松计算n个项的和。

我使用循环和公式评估了结果。循环对于缩短数据范围非常有价值。但是当数据范围增长超过10时, 10 程序需要花费数小时来处理循环结果。但是,当使用简单的算术级数公式时,同样会以毫秒为单位评估结果。

我们真正需要做的是:
算法:

  1. 计算3的倍数之和并加上总和。
  2. 计算5的倍数之和并加上总和。
  3. 计算3 * 5 = 15的倍数之和并从总和中减去。
  4. 以下是我的博文CodeForWin - Project Euler 1: Multiples of 3 and 5

    中java中的代码段
    n--; //Since we need to compute the sum less than n.
    //Check if n is more than or equal to 3 then compute sum of all divisible by
    //3 and add to sum.  
    if(n>=3) {  
        totalElements = n/3;  
        sum += (totalElements * ( 3 + totalElements*3)) / 2;  
    }  
    
    //Check if n is more than or equal to 5 then compute sum of all elements   
    //divisible by 5 and add to sum.  
    if(n >= 5) {  
        totalElements = n/5;  
        sum += (totalElements * (5 + totalElements * 5)) / 2;  
    }  
    
    //Check if n is more than or equal to 15 then compute sum of all elements  
    //divisible by 15 and subtract from sum.  
    if(n >= 15) {  
        totalElements = n/15;  
        sum -= (totalElements * (15 + totalElements * 15)) / 2;  
    }  
    
    System.out.println(sum); 
    

答案 4 :(得分:0)

我如何解决这个问题是我取了一个整数值(初始化为零)并继续添加i的递增值,如果它的模数为3或5则为零。

-(void)userPhotoLibrary{
    UIImagePickerController *p;
    p = [[UIImagePickerController alloc]init];

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        [p setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
        [p setDelegate:self];
        p.allowsEditing = YES;

        [self presentViewController:p animated:YES completion:nil];
    }else{
        NSString *alertTitle = NSLocalizedString(@"NoPhotosAlertTitle", @"The photos are not available title");
        NSString *alertMessage = NSLocalizedString(@"NoPhotosAlertMessage", @"The photos are not available message");
        NSString *alertContinue = NSLocalizedString(@"NoPhotosAlertContinueButton", @"The photos are not available continue button label");
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:alertTitle message:alertMessage preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                              handler:^(UIAlertAction * action) {}];
        UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:alertContinue style:UIAlertActionStyleDefault
                                                             handler:^(UIAlertAction * action) {}];
        [alert addAction:defaultAction];
        [alert addAction:cancelAction];
        [self presentViewController:alert animated:YES completion:nil];

    }

}

答案 5 :(得分:0)

我这样做了好几次。完成Java所需代码的最快,最简洁和最简单的方法是:

public class MultiplesOf3And5 {

public static void main(String[] args){

System.out.println("The sum of the multiples of 3 and 5 is: " + getSum());

}

private static int getSum() {
int sum = 0;
for (int i = 1; i < 1000; i++) {
    if (i % 3 == 0 || i % 5 == 0) {
        sum += i;
    }
}
return sum;
}

如果有人建议将其缩减到更少的代码行,请告诉我您的解决方案。我是编程新手。

答案 6 :(得分:0)

    int count = 0;
for (int i = 1; i <= 1000 / 3; i++)
{
count = count + (i * 3);
if (i < 1000 / 5 && !(i % 3 == 0))
{
count = count + (i * 5);
}
}

答案 7 :(得分:0)

其他人已经指出了您代码中的错误,但我想补充一点,模运算符解决方案不是最效率

更快的实施应该是这样的:

int multiply3_5(int max)
{
  int i, x3 = 0, x5 = 0, x15 = 0;
    
  for(i = 3; i < max; i+=3)    x3 += i;    // Store all multiples of 3
  for(i = 5; i < max; i+=5)    x5 += i;    //  Store all multiples of 5
  for(i = 15; i < max; i+=15)  x15 += i;   //   Store all multiples 15; 
 
  return x3+x5-x15;
}

在这个解决方案中,我不得不取出 15 的倍数,因为 3 和 5 有 15 的倍数,所以在第二个循环中它会添加第一个循环中已经添加的 15 的倍数;

时间复杂度为 O(1)

另一个更好的解决方案(时间复杂度为 O(1))是采用数学方法。

您正在尝试对所有数字求和 3 + 6 + 9 ... 1000 和 5 + 10 + 15 +20 + ... 1000 这与 3 * (1 + 2 + 3 + 4 + ... + 333) 和 5 * ( 1 + 2 + 3 + 4 + ... + 200),'n' 个自然数的和是 (n * (n + 1)) (source) 所以您可以在恒定时间内进行计算,如下所示:

int multiply3_5(int max)
{
   int x3 =   (max - 1) / 3; 
   int x5 =   (max - 1) / 5;
   int x15 =  (max - 1) / 15;                  
   int sn3 =  (x3 * (x3 + 1)) / 2; 
   int sn5 =  (x5 * (x5 + 1)) / 2; 
   int sn15 = (x15 * (x15 + 1)) / 2;
   return (3*sn3) + (5 *sn5) - (15*sn15);
}

运行示例:

public class SumMultiples2And5 {

    public static int multiply3_5_complexityN(int max){
        int i, x3 = 0, x5 = 0, x15 = 0;

        for(i = 3; i < max; i+=3)    x3 += i;    // Store all multiples of 3
        for(i = 5; i < max; i+=5)    x5 += i;    //  Store all multiples of 5
        for(i = 15; i < max; i+=15)  x15 += i;   //   Store all multiples 15;

        return x3 + x5 - x15;
    }

    public static int multiply3_5_constant(int max){
        int x3 =   (max - 1) / 3;
        int x5 =   (max - 1) / 5;
        int x15 =  (max - 1) / 15;
        int sn3 =  (x3 * (x3 + 1)) / 2;
        int sn5 =  (x5 * (x5 + 1)) / 2;
        int sn15 = (x15 * (x15 + 1)) / 2;
        return (3*sn3) + (5 *sn5) - (15*sn15);
    }

    public static void main(String[] args) {
        System.out.println(multiply3_5_complexityN(1000));
        System.out.println(multiply3_5_constant(1000));
    }
}

输出:

233168
233168

答案 8 :(得分:-1)

你正在计算两次数字。你需要做的是在for循环中添加一个,并使用if-else语句,如果你发现3的倍数,你也不会在5中计算它们。

 if(temp % 3 == 0){
     x.add(temp);
     totalforthree += temp;
 } else if(temp % 5 == 0){
     y.add(temp);
     totalforfive += temp;
 }

答案 9 :(得分:-1)

上面给出的逻辑显示错误的答案,因为3&amp;的倍数采用图5进行计算。在上面的逻辑中有一些东西被遗漏,即15,30,45,60 ......是3的倍数,也是5的倍数。然后我们需要在添加时忽略它。

    public static void main(String[] args) {
    int Sum=0, i=0, j=0;
    for(i=0;i<=1000;i++)
        if (i%3==0 && i<=999)
            Sum=Sum+i;
    for(j=0;j<=1000;j++)
        if (j%5==0 && j<1000 && j*5%3!=0)
            Sum=Sum+j;
    System.out.println("The Sum is "+Sum);
}

答案 10 :(得分:-1)

好的,所以这不是最好看的代码,但它完成了工作。

public class Multiples {

public static void main(String[]args) {
    int firstNumber = 3;
    int secondNumber = 5;
    ArrayList<Integer> numberToCheck = new ArrayList<Integer>();
    ArrayList<Integer> multiples = new ArrayList<Integer>();
    int sumOfMultiples = 0;
    for (int i = 0; i < 1000; i++) {
       numberToCheck.add(i);

       if (numberToCheck.get(i) % firstNumber == 0 || numberToCheck.get(i) % secondNumber == 0) {
           multiples.add(numberToCheck.get(i));
       }

    }

    for (int i=0; i<multiples.size(); i++) {

     sumOfMultiples += multiples.get(i);

    }
    System.out.println(multiples);
    System.out.println("Sum Of Multiples: " + sumOfMultiples);

}

}

答案 11 :(得分:-1)

如果数字是10,则3的倍数是3,6,9,5的倍数是5,10总和是33,程序给出相同的答案:

package com.parag;

/*
 * @author Parag Satav
 */
public class MultipleAddition {

    /**
     * @param args
     */
    public static void main( final String[] args ) {
    // TODO Auto-generated method stub

    ArrayList<Integer> x = new ArrayList<Integer>();
    ArrayList<Integer> y = new ArrayList<Integer>();
    int totalforthree = 0;
    int totalforfive = 0;
    int number = 8;

    int total = 0;

    for ( int temp = 1; temp <= number; temp++ ) {
        if ( temp % 3 == 0 ) {
            x.add( temp );
            totalforthree += temp;
        }

        else if ( temp % 5 == 0 ) {
            y.add( temp );
            totalforfive += temp;
        }
    }

    total = totalforfive + totalforthree;
    System.out.println( "multiples of 3 : " + x );
    System.out.println( "multiples of 5 : " + y );
    System.out.println( "The multiples of 3 or 5 up to " + number + " are: " + total );

}

}

答案 12 :(得分:-1)

public class Solution {
    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t>0){
            int sum = 0;
            int count =0;
            int n = sc.nextInt();
            n--; 
            System.out.println((n/3*(6+(n/3-1)*3))/2 + (n/5*(10+(n/5-1)*5))/2 - (n/15*(30+(n/15-1)*15))/2);
            t--;
    }
}
}