Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
11 Дек 2017, 22:03
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Задача на разложение натурального числа n на простые множители  (Прочитано 4589 раз)

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

Оффлайн julia89

  • *
  • Сообщений: 3
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-04-21
  • Сайт: 
  • Профессия: Ученик 1С
Помогите,пожалуйста,нужно запрограммировать в 1с задачу: дано натуральное число N. Разложите его на простые множители.Что я сделала неправильно.

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

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

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

КонецЦикла;

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


Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Процедура КнопкаВыполнитьНажатие(Кнопка)

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

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


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

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

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

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

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

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

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

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

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

Оффлайн pavl_vs

  • *****
  • Сообщений: 1066
  • РЕПУТАЦИЯ: 168
  • КПД: 16%
  • Регистрация: 2011-05-09
  • Сайт: 
  • Профессия: Программист 7.7
Процедура КнопкаВыполнитьНажатие(Кнопка)
Функция ПолучитьЧислоПростыхМножителей()
Предложенная здесь процедура разложения выполнена в стиле 1С, но работает неправильно - проверьте, например для Ч = 4, 8, 12, 16 ... Нужно подправить.

Помогите,пожалуйста,нужно запрограммировать в 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

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Действительно. Ошибся немного
Нужно просто поправить в цикле сч=2 заменить на сч=1
А условие цикла оставить сч=2
Процедура КнопкаВыполнитьНажатие(Кнопка)

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


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

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

    Возврат Массив;
       
КонецФункции // ПолучитьЧислоПростыхМножителей()
Добавлено: 22 Апр 2013, 17:08

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

Последний раз редактировалось: Dethmontt; 22 Апр 2013, 17:08. Причина: Объединение сообщений

Оффлайн pavl_vs

  • *****
  • Сообщений: 1066
  • РЕПУТАЦИЯ: 168
  • КПД: 16%
  • Регистрация: 2011-05-09
  • Сайт: 
  • Профессия: Программист 7.7
Добавлено: 22 Апр 2013, 17:08

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

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

Оффлайн julia89

  • *
  • Сообщений: 3
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-04-21
  • Сайт: 
  • Профессия: Ученик 1С


Теги:
 

Не получается получить строку табличной части! Помогите пожалуйста, задача серьезнее, чем кажется!

Автор SergejjРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 5
Просмотров: 419
Последний ответ 07 Май 2017, 10:07
от ilnur75
Задача - подсчитать сумму документов в табличной части в 1С Бухгалтерия

Автор evshiРаздел Пользователям "1С - Предприятие 8"

Ответов: 8
Просмотров: 1810
Последний ответ 04 Авг 2015, 08:25
от SvetlanaN
Задача хранение и печать документов из 1С Предприятия 8.3

Автор Денис МанчинскийРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 0
Просмотров: 248
Последний ответ 06 Фев 2017, 16:03
от Денис Манчинский
Перенесено: Задача по операционному учету в 1С 8.0-8.1

Автор progmikonРаздел Пользователям "1С - Предприятие 8"

Ответов: 0
Просмотров: 1160
Последний ответ 11 Ноя 2010, 00:27
от progmikon
Есть задача - такое возможно?

Автор leonlegionРаздел Пользователям "1С - Предприятие 8"

Ответов: 0
Просмотров: 1420
Последний ответ 01 Фев 2011, 15:17
от leonlegion

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
166 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
56 Сообщений
alex0402
46 Сообщений
andron81_81
44 Сообщений
AIFrame
36 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
BuhRust
28 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 320
  • Точка Скрытых: 0
  • Точка Пользователей: 2
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal