Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2010, 12:53   #1
bloodflood
Пользователь
 
Аватар для bloodflood
 
Регистрация: 28.10.2010
Сообщений: 17
По умолчанию Получить максимальное совершенное число, C++

Может кто поможет? Задача похожая, но тем не менее не знаю как реализовать вторую часть...

Код:
По каждому из некоторого количества натуральных чисел N заменой одной из его цифр на произвольную цифру,
 если это возможно, получить максимальное совершенное число. 
Если совершенных чисел не найдено вывести сообщение.
Ну а что такое совершенное число вы знаете

Последний раз редактировалось bloodflood; 11.11.2010 в 15:34. Причина: а язык? :)
bloodflood вне форума Ответить с цитированием
Старый 11.11.2010, 13:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ну а что такое совершенное число вы знаете
Не угадал. И нечего лезть в чужие темы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2010, 14:47   #3
bloodflood
Пользователь
 
Аватар для bloodflood
 
Регистрация: 28.10.2010
Сообщений: 17
По умолчанию

Пардон, просто суть та же самая была, подумал, что можно

Цитата:
Число М называют совершенным, если оно равно сумме всех своих делителей, включая единицу, но не включая само число М. Например, число 6 является совершенным: 6=1+2+3
Чисел таких (совершенных) в общем довольно мало. (всего 8) Вики // написал о том, что "вы знаете" ибо автор той темы в первом посте описал их

Алгоритм вроде как в принципе понятен:
т.е. берём одно число, считаем количество введенных символов, если для того чтобы введённое число стало нужно поменять только лишь один символ - меняем его на нужный
К примеру ввели число 426, ближайшее максимальное значение которое можно из него получить это 496 путём замены второго числа (что разрешается по условию задачи только 1 раз и 1 число), а если нужно менять более одного символа, что не допустимо, то выводим сообщение: "Совершенное число не найдено". Но проблемы с реализацией (какими методами) и собственно правильный ли этот алгоритм..

p.s. ну и к тому же количество вводимых чисел у нас не указано, а т.е. их может быть столько, сколько захочет пользователь, т.е. нужно будет создать небольшой массив. и чтобы пользователь сначала указал сколько он будет вводить чисел, ввел их, и только потом алгоритм который я привел выше х_х

Последний раз редактировалось bloodflood; 11.11.2010 в 15:24.
bloodflood вне форума Ответить с цитированием
Старый 11.11.2010, 15:20   #4
bloodflood
Пользователь
 
Аватар для bloodflood
 
Регистрация: 28.10.2010
Сообщений: 17
По умолчанию

Всё что пока есть:
Код:
#include <iostream>
using namespace std;
int main()
const int r=100;
   {
      int m[r];
      cout<<"vvedite kolichestvo chisel <= "<<r;
	  int k=0;cin>>k;
	     for (int r=0; r < k;  r++)
		    {cout<<"vvedite chislo";
			 cin>>m[r];}

Последний раз редактировалось bloodflood; 11.11.2010 в 19:32.
bloodflood вне форума Ответить с цитированием
Старый 11.11.2010, 16:58   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Это отдельно для каждого числа, дополнительно делители выписываются
Код:
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

bool isSov(int x)
{
    int s = 0;
    for (int i = 1; i <= x / 2; i++)
        if (x % i ==0)
        {
            s += i;
            cout << i << " ";
        }
    if (s == x)
    {
        cout << " SOVERSHENNOE";
        return true;
    }
    else return false;
}

int make(int x)
{
    char s[10];
    int max = 0;
    for (int i = 0; s[i] != '\0'; i++)
    {
        itoa(x, s, 10);
        for (char j = '0'; j <= '9'; j ++)
        {
            s[i] = j;
            int k = atoi(s);
            cout << "\n" << k << ": ";
            if (isSov(k) && (max < k)) max = k;
        }
    }
    return max;
}

int main()
{
    int n, q;
    cout << "n = ";
    cin >> n;
    q = make(n);
    if (q == 0) cout << "\nno found"; else cout << "\nfound " << q;
    return 0;
}
Прогоняй главную функцию в цикле для каждого числа "из некоторого количества натуральных чисел"
eoln вне форума Ответить с цитированием
Старый 11.11.2010, 17:12   #6
bloodflood
Пользователь
 
Аватар для bloodflood
 
Регистрация: 28.10.2010
Сообщений: 17
По умолчанию

Большое спасибо! Правда сложновато в некоторых местах, ибо, к примеру, даже не использовали еще ни разу библиотеку stdlib.h

Цитата:
Сообщение от eoln Посмотреть сообщение
Это отдельно для каждого числа, дополнительно делители выписываются
Код:
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

bool isSov(int x)
{
    int s = 0;
    for (int i = 1; i <= x / 2; i++)
        if (x % i ==0)
        {
            s += i;
            cout << i << " ";
        }
    if (s == x)
    {
        cout << " SOVERSHENNOE";
        return true;
    }
    else return false;
}

int make(int x)
{
    char s[10];
    int max = 0;
    for (int i = 0; s[i] != '\0'; i++)
    {
        itoa(x, s, 10);
        for (char j = '0'; j <= '9'; j ++)
        {
            s[i] = j;
            int k = atoi(s);
            cout << "\n" << k << ": ";
            if (isSov(k) && (max < k)) max = k;
        }
    }
    return max;
}

int main()
{
    int n, q;
    cout << "n = ";
    cin >> n;
    q = make(n);
    if (q == 0) cout << "\nno found"; else cout << "\nfound " << q;
    return 0;
}
Прогоняй главную функцию в цикле для каждого числа "из некоторого количества натуральных чисел"
А можно ли переделать в make так, чтобы не использовались такие функции, как itoa, atoi ?
На это есть две причины: как я понял, использование данных функций не особо приветствуется для написания программ (Википедию почитал), во-вторых они принципе не должны быть задействованы.

А в целом, шикарно 8)

Последний раз редактировалось Stilet; 15.12.2010 в 10:25.
bloodflood вне форума Ответить с цитированием
Старый 09.12.2010, 20:34   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А чем они тебя не устроили?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2010, 21:01   #8
bloodflood
Пользователь
 
Аватар для bloodflood
 
Регистрация: 28.10.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А чем они тебя не устроили?
Я написал серым цветом то, что не устраивает в этих функциях.
Я не шибко понимаю их применение, так как, повторюсь, даже библиотеку <stdlib.h> использую впервые и я понимаю, что когда-нибудь мне рано или поздно придется столкнутся с их применением, но..эту задачу нужно решить на уровне без "stdlib.h", если такое возможно в принципе.
bloodflood вне форума Ответить с цитированием
Старый 15.12.2010, 08:02   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Можно заменять разряды в числе используя целочисленное деление и остаток
Код:
int make(int x)
{
    int max = 0;
    int nr = 0;
    int tmp = x;
    while (tmp > 0)
    {
        nr++;//номер изменяемого разряда
        tmp = tmp / 10;//это чтоб знать когда всё прекратить
        for (int j = 0; j <= 9; j++)
        {
            int k = x;
            //убираем у числа более низкие разряды, а текущий разряд переписываем на вариации от 0 до 9
            k = (int)(k / exp(nr * log(10))) * 10 + j;
            //если разряд был не младший, то восстановим недостающие разряды 
            if (nr > 1) k = k * exp((nr - 1) * log(10)) + x % (int)exp((nr - 1) * log(10));
            cout << "\n" << k << ": ";
            if (isSov(k) && (max < k)) max = k;
        }
    }
    return max;
}
eoln вне форума Ответить с цитированием
Старый 15.12.2010, 08:39   #10
Prime123
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 79
По умолчанию

Легче не апать,а в функциях библиотеки разобраться
Если я чем-то вам помог-не стесняйтесь,ставьте +

Если ошибаюсь-поправляйте,учусь на ошибках,реагирую адекватно
Prime123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в vb6 выбрать максимальное число из 3-х? LINKEDimmortal Помощь студентам 0 01.06.2010 19:21
(ASM) Как обозначить максимальное число..?? hen Помощь студентам 2 05.03.2010 12:58
Максимальное число LOVELY Помощь студентам 2 12.02.2010 01:21
Определить максимальное по абсолютному значению число VeseloffS Помощь студентам 17 09.06.2009 23:39
Найти максимальное число.Паскаль. Karabas Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2008 21:13