Как вывести результат работы метода?
Задача:
Разработайте метод sumOfSeven(), который который принимает в качестве аргументов два целых неотрицательных числа a,b( 0 ≤ a,b ≤ 109) и возвращает сумму цифр во всех двузначных натуральных числах, кратных 7 на отрезке [a;b].
Моё решение:
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Введите первое число - ");
int first = s.nextInt();
System.out.println("Введите второе число - ");
int second = s.nextInt();
NumberDigits.sumOfDigits(first,second);
}
}
public class NumberDigits {
public static void sumOfDigits(int value, int value2) {
int sum =0;
int r = value2 - value;
int arr[] = new int[r + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = value;
value = value + 1;
System.out.print(arr[i]);
}
for(int i = 0; i < arr.length; i++){
if((arr[i] < 100) & (arr[i] > 9) & (arr[i]/7 == 0)){
sum = sum + arr[i];
System.out.print(sum);
}
}
}
}
Ответы (2 шт):
- Метод
sumOfDigitsдолжен возвращать сумму, поэтому делаем егоintвместоvoid. Соответственно, печатаем возвращенное значение. - Никаких массивов здесь не нужно, достаточно переменной для суммы
- Кратность 7-и определяем как нулевой остаток от деления числа на 7
- Границы цикла, с учетом необходимости суммировать только цифры двузначных чисел (от 10 до 99) определяем исходя из
а,bи указанных границ
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("Введите первое число - ");
int first = s.nextInt();
System.out.print("Введите второе число - ");
int second = s.nextInt();
System.out.println("Сумма цифр = " + NumberDigits.sumOfDigits(first, second));
}
}
class NumberDigits {
public static int sumOfDigits(int a, int b) {
int sum = 0, x;
for (int i = Math.max(a, 10); i <= Math.min(b, 99); i++)
if (i % 7 == 0) {
x = i;
while (x != 0) {
sum += x % 10;
x /= 10;
}
}
return sum;
}
}
Введите первое число - 2
Введите второе число - 22
Сумма цифр = 8
Проблема кода, представленного в вопросе, скорее в том, что он выводит слишком много промежуточных данных, не относящихся к результату работы, и делает это некачественно -- все числа выводятся в одну строку без пробелов между ними.
Как отмечено в предыдущем ответе, создание массива чисел для решения данной задачи совершенно не требуется.
Даже отладочный вывод следует исправить, добавив пробелы между числами и пустую строку между выводом разных циклов.
Сумма чисел не считается в последнем цикле кода из-за опечатки в последнем условии: (arr[i]/7 == 0) -- вместо остатка % выполняется деление и с учётом предыдущего условия, что все числа должны быть строго больше 9, все числа массива будут проигнорированы.
В любом случае, вычисляться будет не сумма цифр каждого двузначного числа, а сумма двузначных чисел.
Также при проверке чисел массива в if используется не логическая операция &&, а побитовая &, из-за чего произошло нагромождение лишних скобок в операторе if.
Исправленная реализация:
public static void sumOfDigits(int value, int value2) {
int sum = 0;
int r = value2 - value;
int arr[] = new int[r + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = value;
value = value + 1;
System.out.print(arr[i] + " ");
}
System.out.println();
for (int i = 0; i < arr.length; i++) {
if (arr[i] < 100 && arr[i] > 9 && arr[i]%7 == 0) {
sum += arr[i] / 10 + arr[i] % 10;
System.out.print(sum + " ");
}
}
System.out.println("\nsum = " + sum);
}
Корректная реализация (без создания массива и отладочной печати):
- Можно определить минимальное число в диапазоне
Math.max(a, 10)и максимальноеMath.min(b, 10) - Затем подобрать ближайшее число, кратное заданному
d(в данном случаеd = 7), и в цикле использовать приращениеd, вместо проверок на каждом инкременте - Суммировать сумму цифр для оставшихся двузначных чисел, используя операции деления и остатка от деления на 10
public static void printSumOfSeventh(int a, int b) {
printSumOfDigits(a, b, 7);
}
public static void printSumOfDigits(int a, int b, int d) {
int sum = 0;
int start = Math.max(a, 10);
for (int n = start + (start % d == 0 ? 0 : d - start % d), m = Math.min(b, 99); n <= m; n += d) {
sum += n / 10 + n % 10;
}
System.out.println(sum);
}
Тесты
printSumOfSeventh( 5, 25); // 8: 14 = 1 + 4, 21 = 2 + 1
printSumOfSeventh(14, 42); // 32: 14 = 1 + 4, 21 = 2 + 1, 28 = 2 + 8, 35 = 3 + 5, 42 = 4 + 2