Подсчитать у скольких чисел в заданном интервале сумма делителей будет нечётной

151
14 мая 2019, 02:50

Вам даны два натуральных числа А и Б. Посчитайте у скольких чисел в интервале [A;Б] сумма делителей будет нечётным.Ограничение (1<=A<=B<=1000). Не получается сделать правильную сумму, буду рад любой помощи.

#include<iostream>
using namespace std;
int main()
{
    int a = 1, b = 6, sum = 0, total = 0;
    for (int i = a; i <= b; ++i)
    {
        for (int j = 1; j< i ; ++j) { 
            if (i % j == 0) sum += j;//Тут проблема
            if (sum % 2 != 0) ++total;
            sum = 0;
        }
    }
    cout << "Total:" << total << endl;
    system("pause");
    return 0;
}
Answer 1

Если считать 1 как делитель, само число - не считать, и работать перебором (хотя тут есть более хитрые варианты, выгодные при больших числах - например, факторизация на простые числа, подсчет произведения степеней нечетных простых в разложении и на основе этого получение четности суммы делителей. Может, есть способы и еще хитрее, не знаю...) - то я бы делал так, не считая сумму.

bool odd_d(int n)
{
    bool odd = true; // 1!
    for(int i = 2; i*i <= n; ++i)
    {
        if (n%i) continue;
        if (i%2) odd = !odd;
        int d = n/i;
        if (d == i) continue;
        if (d%2) odd = !odd;
    }
    return odd;
}
int main(int argc, const char * argv[])
{
    int a, b, count = 0;
    cin >> a >> b;
    for(int n = a; n <= b; ++n)
        if (odd_d(n)) ++count;
    cout << count << endl;
}
Answer 2

Вопрос закрыт, решение найдено.Исправленный код будет выглядеть так.

#include<iostream>
using namespace std;
int main()
{
    int a = 1, b = 6, sum=0, total = 0;
    for (int i = a; i <= b; ++i)
    {
        for (int j = 1; j<= i ; ++j) { 
            if (i % j == 0) sum += j;
        }
        if (sum % 2 != 0) ++total;
        sum = 0;
    }
    cout << "Total:" << total << endl;
    system("pause");
    return 0;
}
Answer 3

Сигма-функция (σ1 здесь) нечетна для чисел вида p^2 и p^2 * 2 (например, 16, 18, 25)

Количество таких чисел в заданном диапазоне можно посчитать несложным циклом или напрямую с использованием корня (если это не приведёт к ошибкам округления)

int odd_sigma(int n) {
     return (int)sqrt(n) + (int)sqrt(n / 2);
}
int odds_in_inclusive_range(int a, int b) {
   return odd_sigma(b) - odd_sigma(a-1);
}
READ ALSO
&#39;main.moc&#39; file not found Qt

'main.moc' file not found Qt

Здраствуйте, у меня почему то пишет, что "mainmoc" не найдено, а если убираю её, то пишет Symbol(s) not found for architecture x86_64

175
Неопределенный путь к файлу

Неопределенный путь к файлу

Я ламер в программированииРешил написать программу которая будет работать с определенной программой установленной у пользователя на ПК

136
Проблема в слоте: ошибка: undefined reference to `check_t_value(int)&#39;

Проблема в слоте: ошибка: undefined reference to `check_t_value(int)'

У меня есть обычная функция check_t_value(int T_VALUE) и слот slot_conside()

141
размещения с повторениями для букв [закрыт]

размещения с повторениями для букв [закрыт]

есть строка "ACGT" как сделать размещения с повторениями, чтобы получилось что-то подобное

154