Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.74
zambaldzr
#1

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

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

a и b вводятся с клавиатуры,представить в виде функции
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 22:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В интервале от a до b найти число с наибольшим количеством делителей (C++):

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

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

Дан одномерный целочисленный массив. Определить элемент с наибольшим количеством делителей - C++
Ребят, задача такая: "Дан одномерный целочисленный массив. Определить элемент с наибольшим количеством делителей." Помогите плиз...

Определить натуральное число не больше заданного n с наибольшим числом простых делителей - C++
Вот наткнулся на интересную задачку,ну,по карйней мере меня заинтересовала:good:,ну так вот : 1. Определить натурально число не больше...

Найти паралелограмм с наибольшим количеством точек - C++
Приветствую всех. Обращаюсь с помощью, так как эта программа уже выводит меня из себя. Задание состоит в следующем: "Даны N точек на...

Найти слово с наибольшим количеством гласных букв - C++
Гляньте что не так: #include <iostream> #include <string.h> #include <conio.h> using namespace std; void main(){ char...

35
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
26.09.2012, 23:06 #2
Автор, какие твои идеи по поводу решения ?
0
Zambal
83 / 3 / 1
Регистрация: 14.11.2011
Сообщений: 68
27.09.2012, 09:23 #3
ввести а и б,сделать цикл от а до б,вложить цикл,тело которого нацело делит число а на все от 1 до а,каждый раз когда это происходит к какой-нибудь переменной прибавляется 1,после того как приращение прекращается цикл останавливается и выводятся все числа с наибольшим числом делителей
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
27.09.2012, 09:43 #4
Ок, как это выглядит в коде ?
0
Zambal
83 / 3 / 1
Регистрация: 14.11.2011
Сообщений: 68
27.09.2012, 09:58 #5
наверное в этом и вся проблема
непонятно как реализовать пользовательскую функцию
и каким образом установить этот самый предел для количества делителей,по которому будут выбираться числа
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
27.09.2012, 10:09 #6
Всё очень просто. Каждый раз, когда ты встретишь новое число и посчитаешь его кол-во делителей, сравнивай его с максимумом, к-рый ты запомнил. Если у этого числа делителей больше - замени максимум. Запоминать нужно как число, так и кол-во его делителей.
0
zitxbit
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
27.09.2012, 10:44 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,215
27.09.2012, 10:53 #8
Цитата Сообщение от 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
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:07 #9
ValeryS, тогда уж еще усовершенствуйте свой алгоритм, рассматривая делители в диапазоне от 2 до http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}. При этом если число n делится на i из этого диапазона, то оно делится и на n/i. Поясню. если n=ab и http://www.cyberforum.ru/cgi-bin/latex.cgi?2\leq a\leq b, то либо http://www.cyberforum.ru/cgi-bin/latex.cgi?a=b=\sqrt{n}, либо
http://www.cyberforum.ru/cgi-bin/latex.cgi?a<\sqrt{n} и http://www.cyberforum.ru/cgi-bin/latex.cgi?b>\sqrt{n}
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,215
27.09.2012, 11:14 #10
Цитата Сообщение от Thinker Посмотреть сообщение
ValeryS, тогда уж еще усовершенствуйте свой алгоритм, рассматривая делители в диапазоне от 2 до
корень брать много машинного времени а деление на 2 просто сдвиг (1 такт)
и не понятно выиграю я или нет
на малых итерациях точно проиграю,
например от 2 до 9
цикл 2 3 4
на больших может выиграю(надо считать)
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:17 #11
Цитата Сообщение от ValeryS Посмотреть сообщение
корень брать много машинного времени
Почему же, либо берете один раз корень, либо делаете проверку i*i <= n.
При этом экономите кучу времени, не делая пробных лишних делений, если числа большие.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,215
27.09.2012, 11:23 #12
хорошо попробую
но учти пишу прямо в посте, не проверял, могут быть алгоритмические ошибки
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
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:41 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Зачем лишние проверки, лучше уж так
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
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,215
27.09.2012, 11:47 #14
Цитата Сообщение от Thinker Посмотреть сообщение
Зачем лишние проверки, лучше уж так
только при d * d == n
у тебя coint увеличится на 3
сначала на 2 в одном условии и еще на 1 во втором
а делитель то один
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2012, 11:48 #15
внимательнее на for посмотрите, условие там d*d < n
0
27.09.2012, 11:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2012, 11:48
Привет! Вот еще темы с ответами:

Найти слова с наибольшим количеством гласных букв - C++
Вводится строка слов, написанных латинскими буквами. Необходимо вывести слова(-о), в которых содержится наибольшее кол-во гласных букв( e y...

Найти столбец матрицы с наибольшим количеством нулей - C++
Здравствуйте, нужна срочно помощь с двумя программами, а то я в программировании - ноль=/ Первую программу нужно сделать со статическими...

Найти столбец матрицы с наибольшим количеством элементов кратных 5 - C++
Найти номер столбца массива размером МхN, в котором находится наибольшее количество элементов, кратных 5. Элементы задаются датчиком...

Найти в двумерном массиве строку с наибольшим количеством одинаковых элементов - C++
Помогите понять как работать с двумерными массивами. Условие задания: Найти строку с наибольшим количеством одинаковых элементов. Вот что я...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru