2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
1

Делители

09.07.2021, 08:08. Показов 1649. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано натуральное число n. Подсчитайте количество таких пар чисел (a;b), что:

a и b — делители n;
a<b;
a и b — взаимно простые;
ab≤n.
Входные данные

Вводится натуральное число n≤108.

Выходные данные

Выведите количество таких пар.

Примеры
Ввод
10
Вывод
4
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2021, 08:08
Ответы с готовыми решениями:

Делители
По заданному натуральному числу N необходимо вычислить количество натуральных чисел, которые...

Делители
Делители Условие задачи: Дано число n. Найти все его делители. Решение: Т. е. нам нужно...

Делители числа
надо написать программу что находит количество делителей каждого из целых чисел до 120. #include...

Простые делители
Требуется написать программу которая находит сумму простых делителей числа n

13
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 09:04 2
Цитата Сообщение от dmitrii2000 Посмотреть сообщение
Примеры
Ввод
10
Вывод
4
10 = 1 * 10 = 2 * 5
А остальные 2 пары?
-------
А, поняль:
Код
# 10 ≥ 1 * 2
# 10 ≥ 1 * 5
# 10 ≥ 1 * 10
# 10 ≥ 2 * 5

$ Всего пар: 4
Добавлено через 22 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdio>
 
unsigned gcd(unsigned a, unsigned b)
{
  if (!a || !b) return a + b;
  while (a != b) if (a > b) a -= b; else b -= a;
  return a; 
}
 
unsigned pairs_count(unsigned n)
{
  unsigned total = 0;
  for (unsigned a = 1; a * a <= n; a++)
    for (unsigned b = a + 1; a * b <= n; b++)
      if (!(n % a) && !(n % b) && gcd(a, b) == 1) 
        total++, printf("# %u ≥ %u * %u\n", n, a, b);
  return total;  
}
 
int main()
{
  unsigned n = 0;
  do printf("\n? n = ");
  while (scanf("%u", &n) != 1 || !n);
  printf("$ Всего пар: %u\n", pairs_count(n));
  return 0;
}
0
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
09.07.2021, 09:23  [ТС] 3
Программа не проходит по времени.
0
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 09:27 4
Цитата Сообщение от dmitrii2000 Посмотреть сообщение
Программа не проходит по времени.
В условии задачи про время ничего не сказано.
И как и кем это время замеряется и с какого момента?
0
317 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
09.07.2021, 10:24 5
https://en.cppreference.com/w/cpp/numeric/gcd
Потому что mod использовать надо))

C++
1
2
3
4
5
6
unsigned gcd(unsigned a, unsigned b)
{
  if (!a || !b) return a + b;
  while ((a + b) != 0) if (a > b) a %= b; else b %= a;
  return a; 
}
Добавлено через 8 минут
Ладно. Постыдно получилось
C++
1
2
3
4
5
6
7
8
unsigned gcd (unsigned a, unsigned b) 
{
    while (b != 0) {
        a %= b;
        std::swap(a, b);
    }
    return a;
}
Добавлено через 21 секунду
Но кто знает, в чём на самом деле дело
0
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 10:28 6
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Потому что mod использовать надо))
нетЪ.
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Но кто знает, в чём на самом деле дело
чел копипастит исходник, не глядя, на сцайт, где бот его компилит, запускает и пытается взаимодействовать. Думаю, ручной ввод данных там не предусмотрен и происходит через файл.
0
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
09.07.2021, 10:38 7
Небольшая модификация
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned pairs_count(unsigned n)
{
  unsigned total = 0;
  for (unsigned a = 1; a * a <= n; a++)
    if (n%a) continue;
    for (unsigned b = a + 1;  b <= n/a; b++)
      if (!(n % b) && gcd(a, b) == 1) 
        total++, printf("# %u ≥ %u * %u\n", n, a, b);
  return total;  
 
}
0
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 10:46 8
Цитата Сообщение от Байт Посмотреть сообщение
Небольшая модификация
А смысол? По умолчанию логические выражения считаются не полностью, а до очевидного результата.
0
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 10:53 9
Провёл эксперимет со временем. Результаты:

Делители

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <cstdio>
#include <cstdlib>
#include <ctime>
 
unsigned gcd(unsigned a, unsigned b)
{
  if (!a || !b) return a + b;
  while (a != b) if (a > b) a -= b; else b -= a;
  return a; 
}
 
unsigned pairs_count(unsigned n, clock_t &duration)
{
  unsigned total = 0;
  duration = clock();
  
  for (unsigned a = 1; a * a <= n; a++)
    for (unsigned b = a + 1; a * b <= n; b++)
      if (!(n % a) && !(n % b) && gcd(a, b) == 1) 
        total++;//, printf("# %u ≥ %u * %u\n", n, a, b);
        
  duration = clock() - duration;       
  return total;  
}
 
int main()
{
  system("chcp 65001 && cls");
  unsigned n = 0;
  
  
  do printf("\n? n = ");
  while (scanf("%u", &n) != 1 || !n);
  
  clock_t t;
  printf("$ Всего пар: %u\n", pairs_count(n, t));
  printf("$ Время: %lu мс\n", t);
  return 0;
}
Дальше ускорять смысол есть, как думаете?
0
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
09.07.2021, 10:54 10
Цитата Сообщение от Verevkin Посмотреть сообщение
А смысол?
Меньше проходов внутреннего цикла. Неь заведомо не нужных
0
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 10:56 11
Цитата Сообщение от Байт Посмотреть сообщение
Меньше проходов внутреннего цикла. Неь заведомо не нужных
Ты операторные скобки забыль.
Но ты прав, скорость увеличилась, конечно.

Делители
1
Диссидент
Эксперт C
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
09.07.2021, 11:00 12
Цитата Сообщение от Verevkin Посмотреть сообщение
Ты операторные скобки забыль.
Звиняйте....
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned pairs_count(unsigned n)
{
  unsigned total = 0;
  for (unsigned a = 1; a * a <= n; a++) {
    if (n%a) continue;
    for (unsigned b = a + 1;  b <= n/a; b++)
      if (!(n % b) && gcd(a, b) == 1) 
        total++, printf("# %u ≥ %u * %u\n", n, a, b);
  }
  return total;  
 
}
0
Нарушитель
8997 / 4850 / 1119
Регистрация: 12.03.2015
Сообщений: 22,971
09.07.2021, 11:01 13
Цитата Сообщение от Байт Посмотреть сообщение
Звиняйте....
Я вот так допилил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned pairs_count(unsigned n, clock_t &duration)
{
  unsigned total = 0;
  duration = clock();
  
  for (unsigned a = 1; a * a <= n; a++)
    if (!(n % a)) // модификация (© Байт)
      for (unsigned b = a + 1; a * b <= n; b++)
        if (/*!(n % a) &&*/ !(n % b) && gcd(a, b) == 1) 
          total++;//, printf("# %u ≥ %u * %u\n", n, a, b);
        
  duration = clock() - duration;       
  return total;  
}
0
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
10.07.2021, 08:37  [ТС] 14
Скиньте решение пожалуйста
0
10.07.2021, 08:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2021, 08:37
Помогаю со студенческими работами здесь

Общие делители
Создать программу, находящую в массиве из 50 элементов все элементы, имеющие общие делители. Пример...

Общие делители n чисел
вводится n чисел,требуется узнать их общие делители.

Простые делители числа N
Здесь уже много подобных тем. Но толком нигде так и не нашел ответа на вопрос, который меня...

Задача Делители (divisors)
Делители (divisors) Определите, какое из первых n натуральных чисел имеет наибольшее количество...

Программа на C++ найти делители
Найти все делители натурального числа n. программа на циклы

Вывести делители числа n
Нужно вывести делители числа n, НО по три елемента в каждой сттроке. Помогите, пожалуйста)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru