Member 13230582 Ответов: 4

Как я могу решить эту проблему в java/ C / C++? Мое решение показывает TLE (time limit extended)! algo должен быть полностью переработан каким-то другим способом, я думаю!


Вам дан интервал целых чисел [A, B]. для каждого числа в этом интервале вычислите его наибольший нечетный делитель. Выведите сумму этих делителей.

Ввод
Первая строка содержит целое число T, представляющее количество последующих тестовых случаев
Каждый тестовый случай состоит из одной строки, содержащей два целых значения A и B.

Выход
Выходные данные должны содержать ответ для каждого тестового случая в отдельной строке.
Каждый ответ состоит из одного целого значения.


Пример Ввода
3
1 3
1 4
3 9

Пример Вывода
5
6
29

Объяснение
1+1+3=5
1 + 1 + 3 + 1 = 6
3 + 1 + 5 + 3 + 7 + 1 + 9 = 29

Что я уже пробовал:

import java.util.Scanner;
  
class Main {
      public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scn = new Scanner(System.in);
        int t = scn.nextInt();
        while (t-- > 0) {
            int l = scn.nextInt();
            int r = scn.nextInt();
            long sum = 0;
            for (int i = l; i <= r; i++) {
                sum += oddDivisor(i);
            }
            System.out.println(sum);
        }
    }
  
    public static long oddDivisor(int num) {
        long sum = 1;
        for (int i = 1; i * i <= num; i++) {
            if (i * i == num && i%2==1) {
                sum=i;
            } else {
                if (num % i == 0) {
                    if (i % 2 == 1) {
                        sum = i;
                    }
                    if ((num / i) % 2 == 1) {
                        sum = num / i;
                    }
                }
            }
        }
        return (((num%2)==0)?sum:num);
    }
}

4 Ответов

Рейтинг:
2

Patrice T

Цитата:
Как я могу решить эту проблему в java/ C / C++? Мое решение показывает TLE (time limit extended)! algo должен быть полностью переработан каким-то другим способом, я думаю!

Вы должны выйти за рамки утверждений и быть умными.
Как вы справляетесь с листом бумаги и карандашом ? если вам дано число, вы тупо пробуете каждое возможное значение в качестве потенциального наибольшего делителя или используете другой метод ?
Как вы справляетесь со 1000001? Сколько операций вам нужно ? Сколько дивизий ?
Как вы справляетесь со 1000002? Сколько операций вам нужно ? Сколько дивизий ?
Как вы справляетесь со 1000004? Сколько операций вам нужно ? Сколько дивизий ?

Как программист, ваша задача-создавать алгоритмы.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.


Рейтинг:
1

Richard MacCutchan

Вы уже разместили этот вопрос по адресу Как я могу решить эту проблему в java/ C / C++? Мое решение показывает TLE (time limit extended)! algo должен быть полностью переработан каким-то другим способом, я думаю![^], и получил несколько полезных предложений. Пожалуйста, не повторяйте один и тот же вопрос.


Рейтинг:
0

OriginalGriff

Теперь вы начинаете принимать Микки.
Это ваш второй домашний вопрос, с тем же названием.

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

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


Рейтинг:
0

KarstenK

Улучшите вывод во всех критических кодовых путях, то есть в операторе if и return. Это поможет вам понять работу вашего кода.

Сумма нечетных делителей 3: 1 + 3 = 4
Сумма нечетных делителей 1 и 3: 1 + (1 + 3) = 5

Или я что-то упускаю?

Погуглите какой-нибудь лучший нечетный делитель. Если я правильно помню, нечетный делитель должен быть простым целым числом. Это означает рекурсивный вызов, если нет простое число.

Profi-tip напишите несколько тестовых функций, чтобы доказать свои результаты. Как с 8, 24 или 70.