Форум программистов, компьютерный форум CyberForum.ru

Связать две функции - C++

Восстановить пароль Регистрация
 
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
29.11.2013, 17:07     Связать две функции #1
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
 
 
int sd(int n, int d = 1)
{
    if (n==0)
    {
        return 0;
    }
    else
    {
    return d <= n ? (n % d == 0? d + sd(n, d + 1) : sd(n, d + 1)) : 0;
    }
}
int otr (int min, int max)
{
 
    if (min!=max)
    {
        int n=min;
 
        return sd(n);                ;
    }
    else
    {
        return min;
    }
}
 
 
int main()
{   int x,a, y, min, max;
 
    scanf("%d %d", &x, &y);
    if(x==y)
    {
 
        printf("%d",x);
        return 0;
    }
    if (x<y)
    {
        min=x;
        max=y;
        a=otr(min, max);
        printf("%d",a);
        return 0;
    }
    else
    {
        max=x;
        min=y;
    }
 
 
}
Здравствуйте, помогите пожалуйста разобраться с программой. Она должна находить на отрезке число с максимальной суммой делителей. Для случая х==у она работает, а как сделать для остальных случаев, когда все же отрезок [x,y] существует?

Добавлено через 25 минут
Помогите, пожалуйста))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 17:07     Связать две функции
Посмотрите здесь:

C++ Две функции на С++
C++ Две функции для работы с массивом
Как связать две таблицы по нескольким полям? C++
C++ Две одинаковые функции
Нужно соединить две функции в одну C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hwmlex
 Аватар для hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
29.11.2013, 17:25     Связать две функции #2
В цикле перебираете все числа от x до y включительно и считаете сумму делителей каждого числа. Находите максимум среди этих чисел.
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
29.11.2013, 17:32  [ТС]     Связать две функции #3
Так то я б сделал, но циклами и массивами нельзя пользоваться, только рекурсия должна быть, можете помочь?
hwmlex
 Аватар для hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
29.11.2013, 18:46     Связать две функции #4
А массив и не нужен для нахождения максимума.

Сейчас попробую без цикла.

Добавлено через 1 час 5 минут
С перебором не получилось, зато удалось создать немного другую функцию нахождения суммы делителей числа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int sumOfDivisors(int n) /* сумма делителей */
{
    static int sum = 0;
    static int countOfCalls = 0;
 
    if (n - countOfCalls == 0)
        return sum;
 
    sum += !(n % (n - countOfCalls)) ?  (n - countOfCalls) : 0;
    countOfCalls ++;
    sumOfDivisors(n);
 
}
maxim12345
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 72
29.11.2013, 18:56  [ТС]     Связать две функции #5
Спасибо) Но, хотелось бы, чтобы была именно отдельная функция, перебирающая числа отрезка. Однако, спасибо)

Добавлено через 43 секунды
Просто я сам не понимаю, как работает эта функция, ибо новичек
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
29.11.2013, 21:33     Связать две функции #6
Вот программа, которая перебирает отрезок с помощью рекурсии и функции "sd" и выводит на экран максимальную сумму делителей среди чисел, имеющихся на отрезке.

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 <conio.h>
#include <iostream>
 
using namespace std;
 
int sd(int n, int d = 1)
{
    if(n == 0)
    {
        return 0;
    }
    else
    {
        return d <= n ? (n % d == 0 ? d + sd(n, d + 1) : sd(n, d + 1)) : 0;
    }
}
 
int otrez(int min, int max)
{
    if(min == max)
    {
        return sd(min);
    }
 
    if(min == max - 1)
    {
        return sd(min) < sd(min+1) ? sd(min+1) : sd(min);
    }
 
    return sd(min) < otrez(min+1, max) ? otrez(min+1, max) : sd(min);
}
 
int main()
{
    int k = otrez(7, 11);
    cout << "k = " << k << endl;
 
    cout << "Press any key to exit\n";
    _getch();
    return 0;
}
Проверял отрезком (7, 11) - максимальная сумма делителей равна 18 (это сумма делителей числа 10).
Yandex
Объявления
29.11.2013, 21:33     Связать две функции
Ответ Создать тему
Опции темы

Текущее время: 23:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru