Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
31 мая 2024, 18:20

Задача на разложение натурального числа n на простые множители

Автор julia89, 21 апр 2013, 18:42

0 Пользователей и 1 гость просматривают эту тему.

julia89

Помогите,пожалуйста,нужно запрограммировать в 1с задачу: дано натуральное число N. Разложите его на простые множители.Что я сделала неправильно.

Перем ЧислоN;

ВвестиЧисло (ЧислоN, "Введите натуральное число");
ПростыеМножители = ЧислоN,1
Для Сч = 2 По ЧислоN/2 Цикл

Если ЧислоN%Сч = 0 Тогда
ПростыеМножители =   ЧислоN/Сч;
КонецЕсли;

КонецЦикла;

Предупреждение ("Простые множители: " + ПростыеМножители);

Dethmontt

Процедура КнопкаВыполнитьНажатие(Кнопка)

Массив = ПолучитьЧислоПростыхМножителей();
Для Каждого Стр Из Массив Цикл
Сообщить(Стр);
КонецЦикла;

КонецПроцедуры


Функция ПолучитьЧислоПростыхМножителей()

Перем Ч;
Массив = Новый Массив;

Если НЕ ВвестиЧисло(Ч,"Введите целое число",5,0) Тогда
Возврат Массив;
КонецЕсли;

Если Ч=0 Тогда
Возврат Массив;
КонецЕсли;

Для Сч=2 По Ч Цикл
Если Ч=1 Тогда
Прервать;
КонецЕсли;
Если Ч%Сч = 0 Тогда
Массив.Добавить(Сч);
Ч=Ч/Сч;
Сч=2;
КонецЕсли;
КонецЦикла;

Возврат Массив;

КонецФункции // ПолучитьЧислоПростыхМножителей()


Добавлено: 22 апр 2013, 00:21


Проверить можно тут - http://integraloff.net/simple/table_simpl_mn.php
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

pavl_vs

Цитата: Dethmontt от 22 апр 2013, 00:14

Процедура КнопкаВыполнитьНажатие(Кнопка)
Функция ПолучитьЧислоПростыхМножителей()
Предложенная здесь процедура разложения выполнена в стиле 1С, но работает неправильно - проверьте, например для Ч = 4, 8, 12, 16 ... Нужно подправить.

Цитата: julia89 от 21 апр 2013, 18:42
Помогите,пожалуйста,нужно запрограммировать в 1с задачу: дано натуральное число N. Разложите его на простые множители.Что я сделала неправильно.

ПростыеМножители = ЧислоN,1


Этой строкой Вы хотели определить диапазон значений множителей? Но в таком виде запись ошибочна.
И почему от единицы до ЧислоN, а не от нуля?
Что же касается остального, то все правильно, но только для определения одного, минимального, значения (или первого, как хотите) множителя. Необходимо продолжение - этот цикл нужно было вложить в цикл "перебора" новых значений "ЧислоN". Например, имеем начальное число 12. Вами написанное определит "2". Теперь следует разлагать ЧислоN = ЧислоN/2 = 6 в таком же цикле, который опять даст "2" и наконец последнее - "3", т.о. Вы получите "Простые множители: 2, 2, 3"

Вы можете доработать предложенную Dethmontt'ом процедуру либо дождаться, когда это сделает он сам.
А я предложил бы Вам более классический, по стилю программирования, вариант. Он более громоздок, но заметно нагляднее и соответствует рекомендуемой Таблице разложений.

Процедура КнопкаВыполнитьНажатие(Кнопка)
    ПолучитьНаборПростыхМножителей();
КонецПроцедуры

Функция ПолучитьНаборПростыхМножителей()

Перем ЧислоN;
ВвестиЧисло (ЧислоN, "Введите натуральное число",5,0);

ПростыеМножители = ЧислоN;
МножительНайден = Ложь;
Множитель = ЧислоN;
Набор = "";
к = 0;
Пока Множитель <> 1 Цикл
    к = к + 1;
    МножительНайден = Ложь;
    Для Сч = 2 По ЧислоN/2 Цикл
Если ЧислоN%Сч = 0 Тогда
        ПростыеМножители = ЧислоN/Сч;
    МножительНайден  = Истина;
КонецЕсли;
    КонецЦикла;
    Множитель = ПростыеМножители;
    Если Множитель = 0 Тогда
        Набор = Строка(Множитель);
        Прервать
    КонецЕсли;
    Если МножительНайден = Ложь Тогда
Множитель = ЧислоN;
    КонецЕсли;
    Если к = 1 Тогда
Набор = Строка(Множитель);
    Иначе
Набор = Набор + ", " + Строка(Множитель);
    КонецЕсли;
    ЧислоN = ЧислоN/Множитель;
    Если ЧислоN = 1 Тогда Прервать КонецЕсли;
КонецЦикла;

Dethmontt

Действительно. Ошибся немного
Нужно просто поправить в цикле сч=2 заменить на сч=1
А условие цикла оставить сч=2
Процедура КнопкаВыполнитьНажатие(Кнопка)

    Массив = ПолучитьЧислоПростыхМножителей();
    Для Каждого Стр Из Массив Цикл
        Сообщить(Стр);
    КонецЦикла;   
   
КонецПроцедуры


Функция ПолучитьЧислоПростыхМножителей()

    Перем Ч;
    Массив = Новый Массив;
   
    Если НЕ ВвестиЧисло(Ч,"Введите целое число",5,0) Тогда
        Возврат Массив;
    КонецЕсли;   
   
    Если Ч=0 Тогда
        Возврат Массив;
    КонецЕсли;
   
    Для Сч=2 По Ч Цикл
        Если Ч=1 Тогда
            Прервать;
        КонецЕсли;   
        Если Ч%Сч = 0 Тогда
            Массив.Добавить(Сч);
            Ч=Ч/Сч;
            Сч=1;
        КонецЕсли;
    КонецЦикла;   

    Возврат Массив;
       
КонецФункции // ПолучитьЧислоПростыхМножителей()

Добавлено: 22 апр 2013, 17:08


Вариант предложенный pavl_vs работает, точно определяет количество множителей, НО очень хромает производительность
Мой компьютер не справился с таким числом (терпения не хватило дождаться)
ЧислоN = 999999999;
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

pavl_vs

Цитата: Dethmontt от 22 апр 2013, 16:40
Добавлено: 22 апр 2013, 17:08


Вариант предложенный pavl_vs работает, НО очень хромает производительность

Вы правы. Получилось "цикл в цикле" - типичная ошибка новичка; хотелось быстрее и надежнее, ошибки в условиях на индексы иногда дорогого стоят.

julia89


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск