Как найти сумму четных чисел java

This Matrix class takes a int[][] as a parameter and saves it in
the instance variable.

I need to complete the sumOfEvenNumbers method to calculate and return the sum of all the even numbers in the array.

public class Matrix
{
    private int[][] matrix;

    /**
     * Gets the sum of all the even numbers in the matrix
     * @return the sum of all the even numbers
     */
    public int sumOfEvenNumbers()
    {
        int sum = 0;
        for (int[] i: array)                          
        if (i%2 == 0){ 
        sum += i;        
        }
        return sum;
         // TODO: Return the sum of all the numbers which are even
    }
}

Anubian Noob's user avatar

Anubian Noob

13.4k6 gold badges53 silver badges74 bronze badges

asked May 6, 2014 at 2:14

user3606328's user avatar

1

Since you have a 2D array, you’ll need to iterate through rows and columns:

int sum = 0;

for (int i=0;i<arr.length;i++)
    for (int j=0;j<arr[i].length;j++)
        if(arr[i][j] % 2 == 0)
            sum += arr[i][j];

return sum;

Alternatively, use a for-each to make this even simpler:

int sum = 0;

for (int[] innerArr : arr)
    for (int i : innerArr)
        if(i % 2 == 0)
            sum += i;

return sum;

answered May 6, 2014 at 2:20

Anubian Noob's user avatar

Anubian NoobAnubian Noob

13.4k6 gold badges53 silver badges74 bronze badges

2

If you are looking to apply this to a two d array,
try using a normal for loop which has a column counter and a row counter, then adding up the sums.
So basically a for loop inside a for loop. Likewise:

for(int col=0; col < matrix.length; col++)
{
  for(int row=0; row < matrix.length; row++)
 {
  //your code to access display[row][col]
 }
}

Your current code only supports 1 Dimensional arrays with an enhanced for loop. Enhanced for loops are great for printing output, but not for assigning/checking values — especially in multi dimensional arrays.

answered May 6, 2014 at 2:18

Cdog101's user avatar

Cdog101Cdog101

1001 silver badge9 bronze badges

1

Using modulus and branches is expensive and I expect you will find a formula to be quite a bit faster. Try

public long sumOfEvenNumbers() {
    long sum =0;
    for (int[] arr: array)
        for(int i : arr)                          
            sum += (~i & 1) * i;        
    return sum;
}

If you have (i & 1) * i this will be 0 for even and i for odd. This would effective only add odd numbers. To flip this for even numbers, we can flip the bits of i and use (~i & 1) * i which is 0 for odd and i for even.

~i flips all the bits of i and is the same as i ^ -1 or -i - 1 or more accurately -i == ~i + 1

answered May 6, 2014 at 2:19

Peter Lawrey's user avatar

Peter LawreyPeter Lawrey

524k77 gold badges749 silver badges1128 bronze badges

8

package Homeworks;

public class HW89SumEvenIndexEvenRow {
    public static void main(String[] args) {

        int[][] a = {
                {-5,-2,-3,7},
                {1,-5,-2,2},
                {1,-2,3,-4}
        };
        int sum=0;
        for (int i=0;i<a.length;i+=1){
            for (int j=0;j<a[i].length;j++)
                if(i%2==0 ||j%2==0) {
                    sum=sum+a[i][j];
                }
        }
        System.out.println(sum);
    }
}

csabinho's user avatar

csabinho

1,5811 gold badge17 silver badges28 bronze badges

answered Feb 25, 2020 at 22:57

ozkan cil's user avatar

1

Начал изучать java. Получил такое задание «Найти сумму всех четных и сумму нечетных элементов массива». В итоге написал этот код. Но IDEA выдает ошибку
«Exception in thread «main» java.lang.IndexOutOfBoundsException: Index: 2, Size: 2″. Не могу въехать почему и как исправить.
Кроме этого, числа которые должны попадать в динамический массив even попадают в odd и наоборот. Надеюсь, кто то откликнется :)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class task7 {
    public static void main(String[] args) {
        int[] a;
        Scanner z = new Scanner(System.in);
        System.out.println("Enter the number of elements in the array");
        int n = z.nextInt();
        a = new int[n];
        for (int i = 0; i <= (n - 1); i++) { //Принимаем все числа массива
            Scanner x = new Scanner(System.in);
            System.out.println("Enter" + " " + i + " " + "number of the array");
            int b = x.nextInt();
            a[i] = b;
        }



        List<Integer> even = new ArrayList<Integer>();
        List<Integer> odd = new ArrayList<Integer>();
        for(int i = 0; i< n; i++){
            if (a[i]%2==0) {
                even.add(i);
            }
            else {
                odd.add(i);
         }
        }
        int sumEven = 0;
        int sumOdd = 0;
        for (int i = 0; i < n; i++){
            sumEven +=odd.get(i);
        }
        for (int i = 0; i < n; i++){
          sumOdd+=even.get(i);
        }
        System.out.println("Array of even numbers is: " + even);
        System.out.println("The sum of even numbers is " + sumEven);
        System.out.println("Array of odd numbers is: " + odd);
        System.out.println("The sum of odd numbers is " + sumOdd);
    }

}

задан 15 мая 2018 в 16:04

blessed s1r's user avatar

5

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("Enter the number of elements in the array");
        int command = s.nextInt();
        int numbers[] = new int[command];
        for (int i = 0; i < numbers.length; i++) { //Принимаем все числа массива
            System.out.println("Enter" + " " + i + " " + "number of the array");
            numbers[i] = s.nextInt();
        }

        List<Integer> even = new ArrayList<Integer>();
        List<Integer> odd = new ArrayList<Integer>();
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] % 2 == 0) {
                even.add(numbers[i]);
            } else {
                odd.add(numbers[i]);
            }
        }

        int sumEven = 0;
        int sumOdd = 0;
        for (int i = 0; i < even.size(); i++) {
            sumEven += even.get(i);
        }
        for (int i = 0; i < odd.size(); i++) {
            sumOdd += odd.get(i);
        }

        System.out.println("Array of even numbers is: " + even);
        System.out.println("The sum of even numbers is " + sumEven);
        System.out.println("Array of odd numbers is: " + odd);
        System.out.println("The sum of odd numbers is " + sumOdd);
    }
}

Не надо обявлять 2 сканнера, один можно использовать везде в классе.
Выучи Forech loop, он поможет в итерации массивов (я сам не использовал чтобы тебе был понятен код).
И я бы посоветовал давать переменным логичные имена (а не «a, b, n, x и тд.), чтобы ты сам и другой человек не терялся в коде. Если будут вопросы по моему коду задавай, не стесняйся.

ответ дан 15 мая 2018 в 22:42

Aghasi Sargsyan's user avatar

2

stx

6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

1

Сумма всех четных чисел в заданном диапазоне

18.06.2019, 22:43. Показов 14552. Ответов 27

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем привет.

Есть задача:
С помощью цикла for подсчитайте сумму всех четных чисел в диапазоне [-10;10].

Решил так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int sum = 0;
 
        for (int i = -10; i <= 0; i++){
            System.out.print(i + " ");
                if (0==(i%2)){
                    sum = sum + (-1 * i); // меняем знак у числа 
                }
            }
 
        System.out.println();
 
        for (int i = 1; i <= 10; i++){
            System.out.print(i + " ");
            if (0==(i%2)){
                sum += i;
            }
        }
 
        System.out.println("nСумма всех чётных чисел в диапазоне [-10;10]: " + sum);

Может есть более изящное решение?
Буду благодарен за критику и подсказки.

Добавлено через 32 минуты
Есть ещё такой вариант:

Java
1
2
3
4
5
6
7
8
9
10
11
12
        int sum = 0;
 
        for (int i = -10; i <= 10; i++){
            System.out.print(i + " ");
                if (0==(i%2) && i <= 0){
                    sum = sum + (-1 * i); // избавляемся от минуса
                } else if (0==(i%2) && i >= 0){
                    sum += i;
                }
            }
 
        System.out.println("nСумма всех чётных чисел в диапазоне [-10;10]: " + sum);

Возможно ли как-нибудь ещё поменять знак у числа?



0



iSmokeJC

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

15987 / 8998 / 2605

Регистрация: 21.10.2017

Сообщений: 20,699

18.06.2019, 22:53

2

Цитата
Сообщение от stx
Посмотреть сообщение

избавляемся от минуса

Т.е. нужна сумма модулей?

Добавлено через 1 минуту

Java
1
2
3
4
5
int sum = 0;
        for (int i = -10; i <= 10; i += 2) {
            sum += Math.abs(i);
        }
        System.out.println(sum);



1



6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

18.06.2019, 23:02

 [ТС]

3

Цитата
Сообщение от iSmokeJC
Посмотреть сообщение

Т.е. нужна сумма модулей?

В условии этого нет, но в моём решении по-другому никак, иначе в ответе будет 0.
Ваш вариант выдаёт 50, что неверно, к сожалению.



0



Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

15987 / 8998 / 2605

Регистрация: 21.10.2017

Сообщений: 20,699

18.06.2019, 23:07

4

stx, проверь еще раз



0



Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

15987 / 8998 / 2605

Регистрация: 21.10.2017

Сообщений: 20,699

18.06.2019, 23:09

5

Хинт

Сумма всех четных чисел в заданном диапазоне



0



6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

18.06.2019, 23:21

 [ТС]

6

Теперь работает



0



Catstail

Модератор

Эксперт функциональных языков программированияЭксперт Python

35427 / 19452 / 4071

Регистрация: 12.02.2012

Сообщений: 32,486

Записей в блоге: 13

19.06.2019, 09:38

7

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.*;
import java.util.stream.*;
import java.lang.*;
import java.io.*;
 
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int s;
        s=IntStream.range(-10,15)
            .filter(x -> x%2==0)
            .sum();
        System.out.println(s);    
    }
}



0



6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

19.06.2019, 21:07

 [ТС]

8

Catstail, к сожалению, код выдаёт неверный ответ: 26
При изменении диапазона на требуемый [-10,10], выдаёт: -10

А ещё IntStream впервые вижу, поэтому для меня сложновато написано



0



46 / 79 / 6

Регистрация: 10.08.2013

Сообщений: 237

19.06.2019, 21:26

9

stx, надо range(-10, 11), он конец интервала не включает.



0



6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

19.06.2019, 21:29

 [ТС]

10

Цитата
Сообщение от rerf2010rerf
Посмотреть сообщение

надо range(-10, 11), он конец интервала не включает.

Поменял на (-10, 11), в ответе: 0
Ответ, к сожалению, неверный.



0



46 / 79 / 6

Регистрация: 10.08.2013

Сообщений: 237

19.06.2019, 21:41

11

Так вам что нужно то? Сумму модулей всё таки?

Цитата
Сообщение от stx
Посмотреть сообщение

Цитата Сообщение от iSmokeJC Посмотреть сообщение
Т.е. нужна сумма модулей?
В условии этого нет, но в моём решении по-другому никак, иначе в ответе будет 0.

И чем вас ноль не устраивает? Если не брать сумму модулей, то ноль и должен быть, ибо интервал симметричен относительно ноля.



0



6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

19.06.2019, 21:56

 [ТС]

12

Цитата
Сообщение от rerf2010rerf
Посмотреть сообщение

И чем вас ноль не устраивает? Если не брать сумму модулей, то ноль и должен быть, ибо интервал симметричен относительно ноля.

В моём понимании условия задачи, нужна сумма модулей



0



rerf2010rerf

46 / 79 / 6

Регистрация: 10.08.2013

Сообщений: 237

19.06.2019, 22:05

13

Ну тогда можно как-то так

Java
1
2
3
4
s=IntStream.range(-10,15)
            .filter(x -> x%2==0)
            .map(Math::abs)
            .sum();



1



Модератор

Эксперт функциональных языков программированияЭксперт Python

35427 / 19452 / 4071

Регистрация: 12.02.2012

Сообщений: 32,486

Записей в блоге: 13

19.06.2019, 22:07

14

Цитата
Сообщение от stx
Посмотреть сообщение

При изменении диапазона на требуемый [-10,10], выдаёт: -10

— естественно. Потому, что правая граница в range не включается. Поэтому правильный диапазон будет range(-10,11). И будет правильный ответ = 0.

Цитата
Сообщение от stx
Посмотреть сообщение

для меня сложновато написано

— в чем сложность? Код короткий. Про stream-ы в Java написаны горы руководств.



2



6 / 6 / 0

Регистрация: 17.09.2012

Сообщений: 104

19.06.2019, 22:49

 [ТС]

15

Цитата
Сообщение от Catstail
Посмотреть сообщение

в чем сложность? Код короткий. Про stream-ы в Java написаны горы руководств.

Сложность в том, что я начинающий в Java
Про стримы обязательно почитаю, спасибо.



0



alicesmagic

233 / 130 / 27

Регистрация: 24.08.2016

Сообщений: 874

20.06.2019, 08:53

16

Вообще, задача изначально сформулирована вполне однозначно.
«С помощью цикла for подсчитайте сумму всех четных чисел в диапазоне [-10;10]»
Странное нежелание топикстартера видеть в ответе 0 не должна быть основанием для суммирования модулей.
И, следовательно, самый короткий и изящный код должен быть таким:

Java
1
2
3
4
int sum = 0;
for (int i = -10; i <= 10; i += 2) {
   sum += i;
}

println() в данном случае не обязателен… ведь в условии требуется только подсчитать

Добавлено через 5 минут

Цитата
Сообщение от Catstail
Посмотреть сообщение

в чем сложность? Код короткий. Про stream-ы в Java написаны горы руководств.

Не соответствует условию задачи. В условии: «С помощью цикла for…»



1



Автоматизируй это!

Эксперт Python

7063 / 4379 / 1177

Регистрация: 30.03.2015

Сообщений: 12,815

Записей в блоге: 29

20.06.2019, 10:05

17

Цитата
Сообщение от alicesmagic3d
Посмотреть сообщение

амый короткий и изящный код должен быть таким:

не совсем так, почти. Самый изящный — это когда метод принимает левую и правую границу диапазона и возвращает сумму

Цитата
Сообщение от alicesmagic3d
Посмотреть сообщение

Странное нежелание топикстартера видеть в ответе 0 не должна быть основанием для суммирования модулей.

Цитата
Сообщение от alicesmagic3d
Посмотреть сообщение

Не соответствует условию задачи. В условии: «С помощью цикла for…»



1



Catstail

20.06.2019, 10:31

Не по теме:

Цитата
Сообщение от alicesmagic3d
Посмотреть сообщение

Не соответствует условию задачи. В условии: «С помощью цикла for…»

— согласен…



0



alicesmagic

233 / 130 / 27

Регистрация: 24.08.2016

Сообщений: 874

20.06.2019, 11:16

19

Цитата
Сообщение от Welemir1
Посмотреть сообщение

Самый изящный — это когда метод принимает левую и правую границу диапазона и возвращает сумму

Согласна. Тогда только «самый короткий»

Добавлено через 10 минут
А вот так?:

Java
1
for (int i = -10, sum = i; i <= 10; i += 2, sum += i);



0



2442 / 1898 / 475

Регистрация: 17.02.2014

Сообщений: 9,154

20.06.2019, 13:04

20

Цитата
Сообщение от alicesmagic3d
Посмотреть сообщение

самый короткий

это, когда не нужно считать, а понимаешь, что ряд симметричен, или считать формулой арифметической прогрессии.



0



Ребята, подскажите!

Знаю как посчитать сумму нечетных чисел.А вот как объединить эти операции не знаю(((

package com.javarush.task.pro.task05.task0523;

/*
Охота на Кибердракона
*/

public class Solution {
public static int[] coordinates = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

public static void main(String[] args) {
int summa = 0;
for(int i=2; i< coordinates.length; i=i+2) {
summa+=i;
}
System.out.println(summa);
}
}

Этот класс Matrix занимает int[][] в качестве параметра и сохраняет его в переменной экземпляра.

Мне нужно завершить sumOfEvenNumbers метод для вычисления и возврата суммы всех четных чисел в массиве.

public class Matrix
{
    private int[][] matrix;

    /**
     * Gets the sum of all the even numbers in the matrix
     * @return the sum of all the even numbers
     */
    public int sumOfEvenNumbers()
    {
        int sum = 0;
        for (int[] i: array)                          
        if (i%2 == 0){ 
        sum += i;        
        }
        return sum;
         // TODO: Return the sum of all the numbers which are even
    }
}

2014-05-06 02:14

3
ответа

Поскольку у вас есть 2D-массив, вам нужно будет перебирать строки и столбцы:

int sum = 0;

for (int i=0;i<arr.length;i++)
    for (int j=0;j<arr[i].length;j++)
        if(arr[i][j] % 2 == 0)
            sum += arr[i][j];

return sum;

В качестве альтернативы используйте for-each, чтобы сделать это еще проще:

int sum = 0;

for (int[] innerArr : arr)
    for (int i : innerArr)
        if(i % 2 == 0)
            sum += i;

return sum;

2014-05-06 02:20

Использование модулей и ветвей стоит дорого, и я ожидаю, что вы найдете формулу немного быстрее. Пытаться

public long sumOfEvenNumbers() {
    long sum =0;
    for (int[] arr: array)
        for(int i : arr)                          
            sum += (~i & 1) * i;        
    return sum;
}

Если у вас есть (i & 1) * i это будет 0 даже и i как ни странно. Это будет эффективно только добавить нечетные числа. Чтобы перевернуть это для четных чисел, мы можем перевернуть биты i и использовать (~i & 1) * i который 0 для странных и i даже для.

~i переворачивает все биты i и так же, как i ^ -1 или же -i - 1 или точнее -i == ~i + 1


user57695

06 май ’14 в 02:19
2014-05-06 02:19

2014-05-06 02:19

Если вы хотите применить это к массиву двух d, попробуйте использовать обычный цикл for, который имеет счетчик столбцов и счетчик строк, а затем сложите суммы. Так что в основном цикл for внутри цикла for. Точно так же:

for(int col=0; col < matrix.length; col++)
{
  for(int row=0; row < matrix.length; row++)
 {
  //your code to access display[row][col]
 }
}

Ваш текущий код поддерживает только одномерные массивы с расширенным циклом for. Усовершенствованные циклы for отлично подходят для вывода на печать, но не для назначения / проверки значений, особенно в многомерных массивах.

2014-05-06 02:18

package Homeworks;

public class HW89SumEvenIndexEvenRow {
    public static void main(String[] args) {

        int[][] a = {
                {-5,-2,-3,7},
                {1,-5,-2,2},
                {1,-2,3,-4}
        };
        int sum=0;
        for (int i=0;i<a.length;i+=1){
            for (int j=0;j<a[i].length;j++)
                if(i%2==0 ||j%2==0) {
                    sum=sum+a[i][j];
                }
        }
        System.out.println(sum);
    }
}

2020-02-26 01:57

Понравилась статья? Поделить с друзьями:
  • Как найти на чеке фискальный накопитель
  • Как найти девушку молчаливому парню
  • Как найти столбец неизвестных в матрице
  • Как с помощью картинки найти видео
  • Как составить кроссворд на военную тему