Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74

Факторизация на HomeLisp

31.03.2016, 17:50. Показов 2140. Ответов 14
Метки c++, lisp (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу указать на ошибки и указать, как их можно исправить.
Разбираюсь с homelisp, нужно сделать факторизацию числа, то есть разбить на множители. Пытался перенести код(рабочий 100%) с++ на lisp, ниже два кода, лисп и си. Ошибка в программе на лиспе:

Неожиданный конец списка.
Последнее выражение: (DO NIL ((<= i (SQR n))) (IF (= 0 (REMAINDER (%) n i)) (= n n/i) (PRINTLINE n) (PRINTS "* ") (+ i 1)))
Глубина вызова EVAL: 18
==> ERRSTATE
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun p (n)
(setq i 2);;объявление переменной
 
 (do (
        ;; задание нач. значений и форм приращений, пусто
     )
     (
       (<= i (sqr n));;условие остановки цикла
     )
           
       (if (= 0 (remainder(%) n i))  ;; Истино - если не Nil
             (= n n/i)(printline n) (prints "* ")     ;; если да, то выводим n
             (+ i 1)    ;; если нет, то плюсуем и заново
       )    
  )
)

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
// factorialization.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <conio.h>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    double n, i;
    scanf_s("%lf", &n);
    i = 2;
    while (i <= (sqrt(n)))
    if ((int)n % (int)i == 0) {
        printf_s("%.0lf*", i);
        n = n / i;
    }
    else
        i = i + 1;
    printf_s("%.0lf", n);
    _getch();
    return 0;
    
}
Добавлено через 2 часа 1 минуту
Переделал тот код, сделал бесконечный цикл, но проблема теперь во вложенном if, как я понимаю. Не могу понять как верно разделить их, как корректно задать значения в true и false.

Lisp
1
2
3
4
5
6
7
8
9
(defun p (n)
     
      (setq i 2)
      
 (loop (if(<= i (sqr n)) 
             (if (zerop(remainder n i)) ((= n n/i)(print n)(prints "* ")) (add1 i))   
             (return 'ok))
 )
)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2016, 17:50
Ответы с готовыми решениями:

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

Факторизация числа
Известно, что факторизация числа -- это разложение на простые множители. Так же известно, что любое число можно факторизовать. Нужно...

Факторизация числа
Разложить целое число на множители с помощью алгоритма Полларда. Проверить является ли множитель простым числом, если нет, то выполнить...

14
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
31.03.2016, 18:12
Найти все простые делители числа
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,685
Записей в блоге: 14
31.03.2016, 18:38
Если нужны все делители, то вот:
Lisp
1
2
3
4
5
(defun factorize (n)
      (let ((res nil))
          (do ((i 2 (+ i 2)))
                 ((> i (/ n 2)) (reverse res))
                 (when (zerop (% n i)) (push i res)))))
1
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74
31.03.2016, 18:39  [ТС]
Проблема в том, что эти примеры не для homelisp, хотя я их уже пытался переписать, но увы, не работало, вот и решил сам разобраться, но зашел в тупик, так что прошу помощи указать на ошибки. Кстати пример по вашей ссылке схож с моим, просто там еще есть подпрограмма.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,685
Записей в блоге: 14
31.03.2016, 18:40
olegva11, пример проверен именно в Homelisp
0
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,336
31.03.2016, 19:15
Основная ошибка - вот это
Цитата Сообщение от olegva11 Посмотреть сообщение
Пытался перенести код(рабочий 100%) с++ на lisp
как следствие возникло вот это
Цитата Сообщение от olegva11 Посмотреть сообщение
remainder(%)
Цитата Сообщение от olegva11 Посмотреть сообщение
(= n n/i)
0
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74
31.03.2016, 20:05  [ТС]
Catstail, Отвечал _sg, Спасибо большое, но задание найти множители, к примеру если число 10, то найти 2 и 5.

Добавлено через 35 минут
vlisp, Как можно исправить эти ошибки?

Добавлено через 11 минут
То что получилось, подскажите как верно организовать if, в который вложен другой if и как задать несколько функций, которые будут выполнятся при выполнении условия? Пишет, неверное число параметров, если беру условия в скобки, то пишет что не найдена функция.

Lisp
1
2
3
4
5
6
7
8
9
(defun p (n)
     
 (let ((i 2))
      
 (loop (if(<= i (sqr n)) 
             (if (zerop(remainder n i)) (setq n (divide n i))(print n)(prints "* ") (add1 i))   
             (return 'ok))
 ))
)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38162 / 21097 / 4306
Регистрация: 12.02.2012
Сообщений: 34,685
Записей в блоге: 14
31.03.2016, 21:29
Лучший ответ Сообщение было отмечено olegva11 как решение

Решение

olegva11, смотри:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun factorize (n)
      (let ((res nil))
          (do ((i 2 (+ i 1)))
                 ((> i (/ n 2)) (reverse res))
                 (when (zerop (% n i)) (push i res)))))
 
==> factorize
 
(factorize 10)
 
==> (2 5)
Добавлено через 23 минуты
А вот если нужно разложение на простые множители, то:

Lisp
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
(defun is-prime (n)
  (cond ((= n 1) nil)
        ((<= n 3) t)
        ((zerop (% n 2)) nil)
        (t (let ((i 3))
            (loop
                (when (> i (sqr n)) (return t))
                (when (zerop (% n i)) (return nil))
                (setf i (+ i 2))))))) 
 
(defun factorize-p (n)
      (let ((res nil))
          (do ((i 2 (+ i 1)))
                 ((> i (/ n 2)) (reverse res))
                 (when (and (is-prime i)(zerop (% n i))) (push i res)))))
 
==> factorize-p
 
(factorize-p 100)
 
==> (2 5)
 
;; тогда, как:
 
(factorize 100)
 
==> (2 4 5 10 20 25 50)
Добавлено через 13 минут
olegva11, вот код на основе твоего:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(defun p (n)
 (let ((i 2))
       (loop (when (> i (sqr n)) (return 'ok)) 
             (when (zerop (remainder n i)) (printline i))
             (setf i (add1 i)))))   
 
 
==> p
(p 200)
 
2
4
5
8
10
 
==> ok
1
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74
31.03.2016, 22:03  [ТС]
Catstail, Спасибо большое)
0
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,336
31.03.2016, 23:11
Цитата Сообщение от olegva11 Посмотреть сообщение
Как можно исправить эти ошибки?
Изучать лисп, а не копировать чужой код
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
05.04.2016, 20:46
Цитата Сообщение от olegva11 Посмотреть сообщение
подскажите как верно организовать if
if в common lisp может иметь две ветки.
Lisp
1
(if condition then-state else-state)
или одну, тогда вторая создается неявно
Lisp
1
(if condition then-state nil)
для второго варианта есть обертка when
Lisp
1
(when condition then-state)
4
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74
06.04.2016, 01:00  [ТС]
vlisp, Где я копировал чужой код? Я пытался написать свой и сидел не мало времени за ним,потом обратился на форум что бы мне помогли. Я понимаю, вы все здесь гуру, но реально подсказать ошибки и тд вы не можете, как например Catstail, привел несколько реализаций кода, именно моей задачи, за что ему спасибо.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
06.04.2016, 13:57
olegva11, имелось в виду что один и тот же код на разных языках будет разным не только по внешнему виду, но и по структуре. Разберем твой пример
Lisp
1
(if (zerop(remainder n i)) (setq n (divide n i))(print n)(prints "* ") (add1 i))
здесь выражение (setq n (divide n i)) является тем самым then-state, а выражение (print n) является else-state. Выражения (prints "* ") (add1 i) лишние и конечно ошибка времени компиляции. Группировка нескольких к ряду идущих выражений осуществляется с помощью функций (или макросов) prog, progn. В чем их отличие думаю разберешься. Если ты хотел чтобы твой then-state был включал следующие выражения: (setq n (divide n i))(print n)(prints "* "), то их надо просто сгруппировать
Lisp
1
2
3
4
(progn
 (setq n (divide n i))
 (print n)
 (prints "* "))
что ты и пытался сделать, как видно и первого поста, но не знал как. Выражение ((= n n/i)(print n)(prints "* ")) из первого поста в терминах лиспа читается как функция (или макрос) принимающие в качестве аргументов результаты вызова (print n) и (prints "* "), а на месте имени функции/макроса выражение (= n n/i), которое естественно выполнилось бы в скалярную величину (если бы было синтаксически корректным), и по сути является логической ложью. Эквивалент этого выражения на c++ будет таким n == (n / i), а на lisp правильно написать так (= n (/ n i)). Есть еще подозрение что это попытка присваивания, тогда оно должно быть таким:
Lisp
1
(setf n (/ n i))
Синтаксис этого языка прост: (function-or-macros-name arg1 arg2 ...) для всех случаев.
2
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74
06.04.2016, 20:18  [ТС]
cyber-satyr, Спасибо за пояснение, да, я пытался присвоить, а теперь понимаю что сделал глупость.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
06.04.2016, 21:32
scheme
Lisp
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
(define (factorize n)
  (define (prime? n)
    (and (not (zero? (remainder n 2)))
         (let collect ((k (quotient n 2)) (c 3))
           (if (> c k)
               #t
               (and (not (zero? (remainder n c)))
                    (collect k (+ c 2)))))))
  (define (next-prime n)
    (letrec ((iter (lambda (n)
                  (if (prime? n)
                      n
                      (iter (+ 2 n))))))
      (cond ((= n 2) 3)
            ((zero? (remainder n 2)) (iter (+ 1 n)))
            (else (iter (+ 2 n))))))
  (define (iter n divider)
    (cond ((= 1 n) '())
          ((zero? (remainder n divider)) (cons divider (iter (/ n divider) 2)))
          (else (iter n (next-prime divider)))))
  (cond ((zero? n) '())
        ((negative? n) (iter (- n) 2))
        (else (iter n 2))))
 
> (factorize 1011234)
'(2 3 7 24077)
>
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2016, 21:32
Помогаю со студенческими работами здесь

Факторизация числа
Здравствуйте! Помогите пожалуйста произвести факторизацию числа 0x5f0b1630eec4db90cc7f Возможно ли это сделать с помощью...

НОК и факторизация
Собственно говоря, программы есть, вот только я не знаю, как можно сократить время их работы. 1)Требуется найти НОК двух чисел. Входные...

Факторизация по модулям 6 и 4
Мною разработана &quot;Методика определения делимости чисел натурального числового ряда и её практическое применение&quot;. Она основана на...

Факторизация методом NFS
у кого есть какие нибудь исходники для факторизации методом решета числового поля? самому что то пока даже доступный алгоритм не...

Факторизация методом Ферма
не пойму в чем проблема , реализую факторизацию методом Ферма , не пойму почему не работает #include&lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru