Как вывести результат работы метода?

Рейтинг: -1Ответов: 2Опубликовано: 19.02.2023

Задача:

Разработайте метод 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
  1. Метод sumOfDigits должен возвращать сумму, поэтому делаем его int вместо void. Соответственно, печатаем возвращенное значение.
  2. Никаких массивов здесь не нужно, достаточно переменной для суммы
  3. Кратность 7-и определяем как нулевой остаток от деления числа на 7
  4. Границы цикла, с учетом необходимости суммировать только цифры двузначных чисел (от 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
▲ 1

Проблема кода, представленного в вопросе, скорее в том, что он выводит слишком много промежуточных данных, не относящихся к результату работы, и делает это некачественно -- все числа выводятся в одну строку без пробелов между ними.

Как отмечено в предыдущем ответе, создание массива чисел для решения данной задачи совершенно не требуется.
Даже отладочный вывод следует исправить, добавив пробелы между числами и пустую строку между выводом разных циклов.
Сумма чисел не считается в последнем цикле кода из-за опечатки в последнем условии: (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