Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/54: Рейтинг темы: голосов - 54, средняя оценка - 4.69
zambaldzr

В интервале от a до b найти число с наибольшим количеством делителей

26.09.2012, 22:46. Показов 11887. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
a и b вводятся с клавиатуры,представить в виде функции
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2012, 22:46
Ответы с готовыми решениями:

В заданном интервале найти число, с наибольшим количеством делителей
На вход программы подаются положительные числа a и b. Гарантируется, что а <= b. Найти число из этого интервала , у которого наибольшее...

Найти в диапазоне от M до N число с наибольшим количеством делителей. Функция: количество делителей заданного числа
Найти в диапазоне от M до N число с наибольшим количеством делителей. Функция: количество делителей заданного числа ...

Найти в диапазоне от M до N число с наибольшим количеством делителей.
Найти в диапазоне от M до N число с наибольшим количеством делителей. Функция: количество делителей заданного числа. Добавлено через...

35
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
26.09.2012, 23:06
Автор, какие твои идеи по поводу решения ?
0
83 / 3 / 1
Регистрация: 14.11.2011
Сообщений: 68
27.09.2012, 09:23
ввести а и б,сделать цикл от а до б,вложить цикл,тело которого нацело делит число а на все от 1 до а,каждый раз когда это происходит к какой-нибудь переменной прибавляется 1,после того как приращение прекращается цикл останавливается и выводятся все числа с наибольшим числом делителей
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
27.09.2012, 09:43
Ок, как это выглядит в коде ?
0
83 / 3 / 1
Регистрация: 14.11.2011
Сообщений: 68
27.09.2012, 09:58
наверное в этом и вся проблема
непонятно как реализовать пользовательскую функцию
и каким образом установить этот самый предел для количества делителей,по которому будут выбираться числа
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
27.09.2012, 10:09
Всё очень просто. Каждый раз, когда ты встретишь новое число и посчитаешь его кол-во делителей, сравнивай его с максимумом, к-рый ты запомнил. Если у этого числа делителей больше - замени максимум. Запоминать нужно как число, так и кол-во его делителей.
0
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
27.09.2012, 10:44
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <stdio.h>
#include <conio.h>
 
int devident(int a, int b, int* pnum)
{
    int max = 0, num = 0;
    for (int n = a; n <= b; n++)
    {
        int count = 0;
        for (int d = 1; d <= n; d++)
            if ((n % d) == 0) count++;
 
        if (count > max)
        {
            max = count;
            num = n;
        }
    }
 
    if (pnum != NULL) *pnum = num;
 
    return max;
}
 
 
int main()
{
    int a = 0, b = 0, num = 0;
    printf("a = "); scanf("%d",&a);
    printf("b = "); scanf("%d",&b);
 
    int max = devident(a,b, &num);
    printf("number = %d devidents = %d\n",num, max);
 
    _getch();
 
    return 0;
}
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 10:53
Цитата Сообщение от zitxbit Посмотреть сообщение
for (int d = 1; d <= n; d++)
if ((n % d) == 0) count++;
бесполезные итерации
на 1 делится всегда и делитель больше чем половина числа быть не может
следовательно
C++
1
2
for  (int d = 2; d <= n/2; d++)
 if ((n % d) == 0) count++;
Добавлено через 2 минуты
и count изначально инициализировать 2 (число всегда делится на 1 и на самого себя)
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:07
ValeryS, тогда уж еще усовершенствуйте свой алгоритм, рассматривая делители в диапазоне от 2 до https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}. При этом если число n делится на i из этого диапазона, то оно делится и на n/i. Поясню. если n=ab и https://www.cyberforum.ru/cgi-bin/latex.cgi?2\leq a\leq b, то либо https://www.cyberforum.ru/cgi-bin/latex.cgi?a=b=\sqrt{n}, либо
https://www.cyberforum.ru/cgi-bin/latex.cgi?a<\sqrt{n} и https://www.cyberforum.ru/cgi-bin/latex.cgi?b>\sqrt{n}
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 11:14
Цитата Сообщение от Thinker Посмотреть сообщение
ValeryS, тогда уж еще усовершенствуйте свой алгоритм, рассматривая делители в диапазоне от 2 до
корень брать много машинного времени а деление на 2 просто сдвиг (1 такт)
и не понятно выиграю я или нет
на малых итерациях точно проиграю,
например от 2 до 9
цикл 2 3 4
на больших может выиграю(надо считать)
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:17
Цитата Сообщение от ValeryS Посмотреть сообщение
корень брать много машинного времени
Почему же, либо берете один раз корень, либо делаете проверку i*i <= n.
При этом экономите кучу времени, не делая пробных лишних делений, если числа большие.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 11:23
хорошо попробую
но учти пишу прямо в посте, не проверял, могут быть алгоритмические ошибки
C++
1
2
3
4
5
6
7
8
for  (int d = 2; d *d<= n; d++)
    {
      if(d *d== n)
        coint++; 
     else  
      if ((n % d) == 0) 
                 count+=2;
    }
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:41
Лучший ответ Сообщение было отмечено как решение

Решение

Зачем лишние проверки, лучше уж так
C++
1
2
3
4
5
for  (d = 2; d * d < n; d++)
   if (n % d == 0) 
      count += 2;
if(d * d == n)
   count++;
А можно и так
C++
1
2
3
for  (d = 2; d * d < n; d++)
   count += ((n % d == 0) << 1);
count += (d * d == n);
3
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 11:47
Цитата Сообщение от Thinker Посмотреть сообщение
Зачем лишние проверки, лучше уж так
только при d * d == n
у тебя coint увеличится на 3
сначала на 2 в одном условии и еще на 1 во втором
а делитель то один
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:48
внимательнее на for посмотрите, условие там d*d < n
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 12:42
Цитата Сообщение от Thinker Посмотреть сообщение
внимательнее на for посмотрите, условие там d*d < n
пардон не заметил
просто на автомате подумал что вторая проверка в теле цикла
но тогда d нужно объявить за пределами цикла
нужно обговорить для начинающих
Цитата Сообщение от Thinker Посмотреть сообщение
C++
1
2
3
for (d = 2; d * d < n; d++)
 count += ((n % d == 0) << 1);
count += (d * d == n);
Вот это круто
вообще нет переходов
но боюсь не все поймут
да и явно привести надо буля к инту а то может не умножится
хотя не проверял верю на слово
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 12:47
логические выражения типа (a < b) и т.д. приводятся к 0 или 1 в зависимости от истины, так что здесь все нормально
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 12:53
Цитата Сообщение от Thinker Посмотреть сообщение
логические выражения типа (a < b) и т.д. приводятся к 0 или 1
это то я знаю , точнее приводятся false(0) и true (1)
я просто экспериментировал
C++
1
2
3
4
bool t=false;// t=0;
t++; // t= true =1 
t++; // t= true =1 
t++; // t= true =1
и никакой 2 (хотя она тоже true) не возникало
вот и возник вопрос
C++
1
int m=true<<1;
будет m равна 2 или нет (просто не проверял)
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 12:56
Ну, в крайнем случае можно к типу int привести, это уже не страшно. Тоже не проверял еще
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
27.09.2012, 13:23
Thinker,
проверил работает
причем сравнил три алгоритма (правда на глаз, точных замеров не делал)
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
40
41
#include "stdafx.h"
 int fnc(long long int n)
{
  long long int d; 
   int count=2;
    for (d = 2; d * d < n; d++)
     count += ((n % d == 0) << 1);
    count += (d * d == n);
 return count;
 }
 int fnc1(long long int n)
{
  long long int d; 
   int count=2;
 for (d = 2; d * d <= n; d++)
   {
      if(d *d== n)
        count++; 
     else  
      if ((n % d) == 0) 
            count+=2;
    }
 return count;
 }
int fnc2(long long int n)
{
   long long int d; 
   int count=0;
    for (d = 1; d <= n; d++)
     if(n % d == 0) 
         count++;
    return count;
 }
int _tmain(int argc, _TCHAR* argv[])
{
   int k= fnc(1000000000000);
   int m=fnc1(1000000000000);
   int p=fnc2(1000000000000);
   printf("%d %d %d",k,m,p);
    return 0;
}
fnc и fnc1 менее секунды
fnc2 после 5 минут устал ждать и отрубил программу
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2012, 13:23
Помогаю со студенческими работами здесь

Дано число P, нужно найти число от 1 до Р, с наибольшим количеством делителей
написал проггу, что не правильно уже 3 часа бьюсь... int p; int max=0,a = 0; Console.Write(&quot;Ведите...

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

Найти в диапазоне от M до N число с наибольшим количеством делителей. PHP
Есть форма, в которую мы вводим значения M и N. Ее я написал: &lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; &lt;style&gt; form { ...

Дано n целых чисел. Найти среди них число с наибольшим количеством делителей
Дано n целых чисел.Найти среди них число с наибольшим количеством делителей.

Найти и вывести первое число в интервале a, b с количеством делителей равным c
Даны три натуральных числа a,b,c. Составить программу,которая находит и выводит первое число в интервале a,b с количеством делителей равным...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru