N 以下所有 3 或 5 的倍数之和

问题描述 投票:0回答:7

我必须找到 N 以下所有 3 或 5 的倍数之和。 例如,如果我们必须列出 10 以下的所有自然数,并且是 3 或 5 的倍数,我们会得到 3、5、6 和 9,这些倍数的总和是 23。

现在剩下的唯一问题是我希望它能够读取所有数字然后显示总和,现在它读取一个数字并在其后面显示总和,有什么想法吗?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution{
public static void main(String[] args) throws IOException {


    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String line = br.readLine();
    int Nbr = Integer.parseInt(line);


        for(int j=0; j<Nbr;j++)
        {
            BufferedReader br2 = new BufferedReader(new   InputStreamReader(System.in));
            String line2 = br2.readLine();
            String[] numbers = new String[Nbr];
            numbers[j]= line2;
            System.out.println(Somme(Long.parseLong(numbers[j])));
        }

        }


public static long Somme(long Nn) {
    long s = 0;
    for (int i = 0; i < Nn; i++) {
        if (((i % 3) == 0) || ((i % 5) == 0)) {
            s = s + i;
        }
    }
    return (s);
}
}
java sum challenge-response
7个回答
1
投票

我建议您使用

Scanner
。我还建议您通过以
sum
为增量从
3
迭代到
n
来添加
3
。然后从
5
n
,以
5
为增量(然后排除
3
的倍数,因为它们已经被添加了)。类似的东西

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNextInt()) {
        int n = scanner.nextInt();
        System.out.println(getSum(n));
    }
}

public static long getSum(int n) {
    long sum = 0;
    for (int i = 3; i < n; i += 3) {
        sum += i;
    }
    for (int i = 5; i < n; i += 5) {
        if (i % 3 != 0) { // <-- already added if i is divisible by 3
            sum += i;
        }
    }
    return sum;
}

根据下面的评论,将

main
更改为首先读取计数的
int
,然后将它们存储在数组中。类似的东西

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNextInt()) {
        int toRead = scanner.nextInt();
        int[] vals = new int[toRead];
        for (int t = 0; t < toRead; t++) {
            if (scanner.hasNextInt()) {
                vals[t] = scanner.nextInt();
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int n : vals) {
            sb.append(getSum(n)).append(" ");
        }
        System.out.println(sb);
    }
}

0
投票

将打印语句移到循环之外。

循环之前,

long[] sumArr = new long[Nbr];

内循环,

sumArr[j] = Somme(Long.parseLong(numbers[j]));

循环后,

for (long sum : sumArr) {
    System.out.println(sum);
}

0
投票

如果你想先读取所有 N,然后读取它们并将它们放入数组中,然后尝试找到总和


0
投票

您可以制作

ArrayList
并将总和添加到其中,然后在循环后打印它


0
投票

我们知道,我们需要对 n 以下可被 3 或 5 整除的那些数字求和,其中 n=10 或 100 或更大(这是极限)。但是如果我们有 n=20 那么 15(15%5==0 && 15%3==0) 会出现两次,所以我们只需要添加一次,这样我们就需要检查一个数字是否能被 15 整除(因为 5 *3=15).

   long n1=0,n2=0;
    int i=1,j=1;
    while(3*i<n)
        {
        n1 +=3*i;
        i++;
        if(5*j<n)
            {
            n2+=5*j;
            if(5*j%15==0)
                n2 -=5*j;
            j++;
        }
      }

    System.out.println(n1+n2);
    }

0
投票
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int sum = 0;
        int t = in.nextInt();
        for(int a0 = 0; a0 < t; a0++){
            long n = in.nextInt();
            for(int j=1;j < n;j++)
            if(j % 3 == 0 || j%5 == 0){
                sum+=j;
            }
            System.out.println(sum);
            sum = 0;
        }
        
        
        
    }
}

这是简单的解决方案


0
投票

这可以通过使用方程 O(1) 来完成。

例如:如果n = 10,则10以下会有3个3的因数,可以通过整数除法10 / 3 = 3 (3, 6, 9)得到

总和为 3 + 6 + 9 = 18

我们可以取3作为公因数,所以它就像-

总和 = 3 * (1 + 2 + 3) = 3 * (3 以内的自然数之和)

要获得 n 以内的自然数之和,我们可以使用方程

n*(n+1)/2

所以, 总和 = 3 * (3 * 4) / 2 = 18

使用这个我们可以轻松解决问题

代码:

    int n = 3; //input
    unsigned long sum = 0;
    
    unsigned long nthrees =  n / 3;
    unsigned long nfives = n / 5;
    unsigned long ncommon = n / 15;
   
    if (n % 5 == 0) {
       nfives--;
    }
    
    if (n % 3 == 0) {
       nthrees--;
    }
    
    if (n % 15 == 0) {
        ncommon--;
    }
   
    unsigned long sthrees = ((nthrees * (nthrees + 1)) / 2) * 3;
    unsigned long sfives = ((nfives * (nfives + 1)) / 2 ) * 5;
    unsigned long scommon = ((ncommon * (ncommon + 1)) / 2) * 15;

    printf("%lu\n", sthrees + sfives - scommon);
© www.soinside.com 2019 - 2024. All rights reserved.