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

Является ли натуральное число совершенным. С++. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Mr Twix
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 6
11.01.2012, 12:02     Является ли натуральное число совершенным. С++. #1
Составьте программу,которая проверяет,является ли натуральное число,введенное с клавиатуры совершенным.
Нужна помощь, если кто сталкивался с такой задачей напишите пожайлуста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2012, 12:02     Является ли натуральное число совершенным. С++.
Посмотрите здесь:

Определить функцию, проверяющую, является ли целое число совершенным C++
Ввести натуральное число N. Определить, является ли оно совершенным C++
Определить, является ли число совершенным C++
Дано натуральное число n. Определите, является ли оно степенью числа 2, и если является, то выведите значение этой степени C++
Составить программу, проверяющую является ли данное число совершенным C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.01.2012, 12:19     Является ли натуральное число совершенным. С++. #2
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
#include <iostream>
 
bool is_perfect(int num)
{
    int sum = 0;
 
    for (int d = num / 2; d >= 1; --d)
        if (num % d == 0)
            sum += d;
 
    return sum == num;
}
 
int main()
{
    int num;
 
    std::cout << "Enter number: ";
    std::cin >> num;
 
    std::cout << "Number is " << (is_perfect(num) ? "" : "not ") << "perfect" << std::endl;
 
    return 0;
}
yuraiow
Сообщений: n/a
26.04.2013, 13:45     Является ли натуральное число совершенным. С++. #3
silent_1991, а не подскажешь как реализовать эту программу при помощи классов?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.04.2013, 14:16     Является ли натуральное число совершенным. С++. #4
yuraiow, тут в класс оборачивать нечего. Одна функция проверки.
yuraiow
Сообщений: n/a
26.04.2013, 14:20     Является ли натуральное число совершенным. С++. #5
Tulosba, нет, надо объявить в класс натуральное число
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.04.2013, 14:30     Является ли натуральное число совершенным. С++. #6
yuraiow, а есть ли в этом смысл? Я такового не вижу. Главным аргументом против использования классов выступает то, что сложно придумать, какое у этого класса должно быть состояние, по сути данный алгоритм обладает только поведением. Но если подобным вопросом не задаваться - я вижу несколько возможных решений:
1. В составе класса IntegerUtils, который наряду с другими алгоритмами (например, проверки числа на простоту) содержит и этот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class IntegerUtils
{
public:
    // Другие методы
    
    static bool is_perfect(int num)
    {
        int sum = 0;
        
        for (int d = num / 2; d >= 1; --d)
            if (num % d == 0)
                sum += d;
        
        return sum == num;
    }
    
    // Другие методы
};
2. Класс, состояние которого - число, для которого определяем совершенность, и который кэширует результат, чтобы избежать повторного вычисления, если только само число не изменилось извне:
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
class CachedPerfectnessChecker
{
public:
    CachedPerfectnessChecker(int number):
        m_number(number),
        m_value_changed(true),
        m_cache(false)
    {
    }
    
    int get_number() const
    {
        return m_number;
    }
    
    void set_number(int number)
    {
        if (get_number() != number)
        {
            m_number        = number;
            m_value_changed = true;
        }
    }
    
    bool is_perfect()
    {
        if (m_value_changed)
        {
            int sum = 0;
            int num = get_number();
            
            for (int d = num / 2; d >= 1; --d)
                if (num % d == 0)
                    sum += d;
            
            m_value_changed = false;
            m_cache         = (sum == num);
        }
        
        return m_cache;
    }
    
private:
    int m_number;
    
    bool m_value_changed;
    bool m_cache;
};
3. Ну и в качестве бонуса - вычисление на стадии компиляции (хотя это only for lulz, ибо последнее число, на котором компилятор согласился развернуть шаблон - 1797, а до этого числа совершенных чисел всего 3):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<int N, int D>
struct IsPerfectHelper
{
    static const int result = IsPerfectHelper<N, D - 1>::result + ((N % D == 0) ? D : 0);
};
 
template<int N>
struct IsPerfectHelper<N, 0>
{
    static const int result = 0;
};
 
template<int N>
struct IsPerfect
{
    static const bool result = (N == IsPerfectHelper<N, N / 2>::result);
};
Yandex
Объявления
26.04.2013, 14:30     Является ли натуральное число совершенным. С++.
Ответ Создать тему
Опции темы

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