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
13.4k6 gold badges53 silver badges74 bronze badges
asked May 6, 2014 at 2:14
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 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
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 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
1,5811 gold badge17 silver badges28 bronze badges
answered Feb 25, 2020 at 22:57
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
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
2
stx 6 / 6 / 0 Регистрация: 17.09.2012 Сообщений: 104 |
||||||||
1 |
||||||||
Сумма всех четных чисел в заданном диапазоне18.06.2019, 22:43. Показов 14552. Ответов 27 Метки нет (Все метки)
Всем привет. Есть задача: Решил так:
Может есть более изящное решение? Добавлено через 32 минуты
Возможно ли как-нибудь ещё поменять знак у числа?
0 |
iSmokeJC Am I evil? Yes, I am! 15987 / 8998 / 2605 Регистрация: 21.10.2017 Сообщений: 20,699 |
||||
18.06.2019, 22:53 |
2 |
|||
избавляемся от минуса Т.е. нужна сумма модулей? Добавлено через 1 минуту
1 |
6 / 6 / 0 Регистрация: 17.09.2012 Сообщений: 104 |
|
18.06.2019, 23:02 [ТС] |
3 |
Т.е. нужна сумма модулей? В условии этого нет, но в моём решении по-другому никак, иначе в ответе будет 0.
0 |
Am I evil? Yes, I am! 15987 / 8998 / 2605 Регистрация: 21.10.2017 Сообщений: 20,699 |
|
18.06.2019, 23:07 |
4 |
stx, проверь еще раз
0 |
Am I evil? Yes, I am! 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 Модератор 35427 / 19452 / 4071 Регистрация: 12.02.2012 Сообщений: 32,486 Записей в блоге: 13 |
||||
19.06.2019, 09:38 |
7 |
|||
0 |
6 / 6 / 0 Регистрация: 17.09.2012 Сообщений: 104 |
|
19.06.2019, 21:07 [ТС] |
8 |
Catstail, к сожалению, код выдаёт неверный ответ: 26 А ещё 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 |
надо range(-10, 11), он конец интервала не включает. Поменял на (-10, 11), в ответе: 0
0 |
46 / 79 / 6 Регистрация: 10.08.2013 Сообщений: 237 |
|
19.06.2019, 21:41 |
11 |
Так вам что нужно то? Сумму модулей всё таки?
Цитата Сообщение от iSmokeJC Посмотреть сообщение И чем вас ноль не устраивает? Если не брать сумму модулей, то ноль и должен быть, ибо интервал симметричен относительно ноля.
0 |
6 / 6 / 0 Регистрация: 17.09.2012 Сообщений: 104 |
|
19.06.2019, 21:56 [ТС] |
12 |
И чем вас ноль не устраивает? Если не брать сумму модулей, то ноль и должен быть, ибо интервал симметричен относительно ноля. В моём понимании условия задачи, нужна сумма модулей
0 |
rerf2010rerf 46 / 79 / 6 Регистрация: 10.08.2013 Сообщений: 237 |
||||
19.06.2019, 22:05 |
13 |
|||
Ну тогда можно как-то так
1 |
Модератор 35427 / 19452 / 4071 Регистрация: 12.02.2012 Сообщений: 32,486 Записей в блоге: 13 |
|
19.06.2019, 22:07 |
14 |
При изменении диапазона на требуемый [-10,10], выдаёт: -10 — естественно. Потому, что правая граница в range не включается. Поэтому правильный диапазон будет range(-10,11). И будет правильный ответ = 0.
для меня сложновато написано — в чем сложность? Код короткий. Про stream-ы в Java написаны горы руководств.
2 |
6 / 6 / 0 Регистрация: 17.09.2012 Сообщений: 104 |
|
19.06.2019, 22:49 [ТС] |
15 |
в чем сложность? Код короткий. Про stream-ы в Java написаны горы руководств. Сложность в том, что я начинающий в Java
0 |
alicesmagic 233 / 130 / 27 Регистрация: 24.08.2016 Сообщений: 874 |
||||
20.06.2019, 08:53 |
16 |
|||
Вообще, задача изначально сформулирована вполне однозначно.
println() в данном случае не обязателен… ведь в условии требуется только подсчитать Добавлено через 5 минут
в чем сложность? Код короткий. Про stream-ы в Java написаны горы руководств. Не соответствует условию задачи. В условии: «С помощью цикла for…»
1 |
Автоматизируй это! 7063 / 4379 / 1177 Регистрация: 30.03.2015 Сообщений: 12,815 Записей в блоге: 29 |
|
20.06.2019, 10:05 |
17 |
амый короткий и изящный код должен быть таким: не совсем так, почти. Самый изящный — это когда метод принимает левую и правую границу диапазона и возвращает сумму
Странное нежелание топикстартера видеть в ответе 0 не должна быть основанием для суммирования модулей.
Не соответствует условию задачи. В условии: «С помощью цикла for…»
1 |
Catstail |
20.06.2019, 10:31
|
Не по теме:
Не соответствует условию задачи. В условии: «С помощью цикла for…» — согласен…
0 |
alicesmagic 233 / 130 / 27 Регистрация: 24.08.2016 Сообщений: 874 |
||||
20.06.2019, 11:16 |
19 |
|||
Самый изящный — это когда метод принимает левую и правую границу диапазона и возвращает сумму Согласна. Тогда только «самый короткий» Добавлено через 10 минут
0 |
2442 / 1898 / 475 Регистрация: 17.02.2014 Сообщений: 9,154 |
|
20.06.2019, 13:04 |
20 |
самый короткий это, когда не нужно считать, а понимаешь, что ряд симметричен, или считать формулой арифметической прогрессии.
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