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

Совершенное число. Задача - C++

Восстановить пароль Регистрация
 
gobL1n
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 9
22.12.2011, 13:58     Совершенное число. Задача #1
Дано натуральное число N. Если это возможно, заменить любую из его цифр (только одну) так, чтобы получилось максимальное совершенное число.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2011, 13:58     Совершенное число. Задача
Посмотрите здесь:

Определить, содержит ли последовательность хотя бы одно совершенное число C++
Поменять местами в массиве последнее простое число и первое совершенное C++
C++ Совершенное число
C++ Задача. Совершенное число
C++ Поменять местами в массиве последнее простое число и первое совершенное
C++ Совершенное число
C++ функции (вывести самое большое совершенное число)
C++ Сложить пятнадцатое простое , четвертое совершенное и первое нечетное избыточное число

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.12.2011, 14:43     Совершенное число. Задача #2
Сильно "в лоб". Уже на шестом совершенном числе, если его можно получить из числа, заменив в нём младшую цифру, ждать заканаемся. Но следует учесть, что шестое совершенное число - 8589869056, т.е. немаленькое.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
 
typedef unsigned long long num_t;
 
num_t exchange_digit(num_t number, size_t pos, int digit)
{
    if (digit >= 10)
        return number;
 
    std::ostringstream ostr;
 
    ostr << number;
 
    std::string str_num = ostr.str();
 
    if (pos > str_num.length())
        return number;
 
    str_num[pos] = digit + '0';
 
    num_t new_number;
 
    std::istringstream(str_num) >> new_number;
 
    return new_number;
}
 
bool is_perfect(num_t number)
{
    num_t sum = 0;
 
    for (num_t div = number / 2 + 1; div >= 1; --div)
        if (number % div == 0)
            sum += div;
    
    return number == sum;
}
 
num_t to_perfect(num_t num)
{
    if (is_perfect(num))
        return num;
 
    int num_len = static_cast<int>(log(static_cast<double>(num)) / log(10.0) + 1.0);
 
    for (int pos = num_len - 1; pos >= 0; --pos)
    {
        for (int digit = 9; digit >= 0; --digit)
        {
            num_t change_num = exchange_digit(num, pos, digit);
 
            if (is_perfect(change_num))
                return change_num;
        }
    }
 
    return num;
}
 
int main()
{
    std::cout << to_perfect(8128) << std::endl;
    std::cout << to_perfect(1128) << std::endl;
    std::cout << to_perfect(8228) << std::endl;
    std::cout << to_perfect(8138) << std::endl;
    std::cout << to_perfect(8124) << std::endl;
    std::cout << to_perfect(8218) << std::endl;
 
    return 0;
}
Yandex
Объявления
22.12.2011, 14:43     Совершенное число. Задача
Ответ Создать тему
Опции темы

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