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

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

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

Author24 — интернет-сервис помощи студентам
Прошу указать на ошибки и указать, как их можно исправить.
Разбираюсь с 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2016, 17:50
Ответы с готовыми решениями:

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

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

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

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

14
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
31.03.2016, 18:12 2
Найти все простые делители числа
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
31.03.2016, 18:38 3
Если нужны все делители, то вот:
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  [ТС] 4
Проблема в том, что эти примеры не для homelisp, хотя я их уже пытался переписать, но увы, не работало, вот и решил сам разобраться, но зашел в тупик, так что прошу помощи указать на ошибки. Кстати пример по вашей ссылке схож с моим, просто там еще есть подпрограмма.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
31.03.2016, 18:40 5
olegva11, пример проверен именно в Homelisp
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,019
31.03.2016, 19:15 6
Основная ошибка - вот это
Цитата Сообщение от olegva11 Посмотреть сообщение
Пытался перенести код(рабочий 100%) с++ на lisp
как следствие возникло вот это
Цитата Сообщение от olegva11 Посмотреть сообщение
remainder(%)
Цитата Сообщение от olegva11 Посмотреть сообщение
(= n n/i)
0
9 / 9 / 5
Регистрация: 29.11.2013
Сообщений: 74
31.03.2016, 20:05  [ТС] 7
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
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
31.03.2016, 21:29 8
Лучший ответ Сообщение было отмечено 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  [ТС] 9
Catstail, Спасибо большое)
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,019
31.03.2016, 23:11 10
Цитата Сообщение от olegva11 Посмотреть сообщение
Как можно исправить эти ошибки?
Изучать лисп, а не копировать чужой код
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
05.04.2016, 20:46 11
Цитата Сообщение от 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  [ТС] 12
vlisp, Где я копировал чужой код? Я пытался написать свой и сидел не мало времени за ним,потом обратился на форум что бы мне помогли. Я понимаю, вы все здесь гуру, но реально подсказать ошибки и тд вы не можете, как например Catstail, привел несколько реализаций кода, именно моей задачи, за что ему спасибо.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
06.04.2016, 13:57 13
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  [ТС] 14
cyber-satyr, Спасибо за пояснение, да, я пытался присвоить, а теперь понимаю что сделал глупость.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
06.04.2016, 21:32 15
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
06.04.2016, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 21:32
Помогаю со студенческими работами здесь

НОК и факторизация
Собственно говоря, программы есть, вот только я не знаю, как можно сократить время их работы....

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

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

Факторизация методом Ферма
не пойму в чем проблема , реализую факторизацию методом Ферма , не пойму почему не работает ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru