Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Assembler [простые множители числа]

Модерирует : ShIvADeSt

ShIvADeSt (21-12-2009 02:50): http://forum.ru-board.com/topic.cgi?forum=33&topic=7682&start=580#lt  Версия для печати • ПодписатьсяДобавить в закладки

   

JacobyD

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята... прошу хелп!!!
 
Необходимо найти все простые множители (делятся только на 1 и на само себя без остатка) введенного с клавиатуры числа и вывести его на екран.
Вот что я написал... (ввод числа с клавы не сделал)
 

Код:
 
 
;prg_12_1.asm
MASM
MODEL small
STACK 256
.data
mes    db    0ah,0dh,'MacciB- ','$'
mas    dw    10 dup (?) ;исходный массив
i    dw    1
r     dw    1
x     dw 770
d dw 123
xz db 2
 
pchh dw 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101
,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,
211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,
337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,
461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,
601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,
739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,
881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997  
 
 
 
.code
main:
    mov    ax,@data
    mov    ds,ax
 
xor ax,ax
xor bx,bx
 
 
 
 
mov ax,x
 
m0:
mov si,i
 
inc i
 
 
 
 
mov dx,x
 
 
div pchh[si]
cmp ah,0
je m1
jmp m0
 
 
m1:
inc r
mov cx,r
 
 
 
mov bx,pchh[bx]
mov mas[2],123
 
 
 
 
 
 
 
 
 
 
 
 
jmp m0
 
 
 
 
 
 
pesd:
    mov    cx,5
    mov    si,0
    mov    ah,09h
    lea    dx,mes
    int    21h
show:
    mov    ah,02h    ;функция вывода значения
                ;из al на экран
    mov    dx,mas[si]
    add    dx,30h    ;преобразование числа в символ
    int    21h
    inc    si
    loop    show
exit:
    mov    ax,4c00h    ;стандартный выход
    int    21h
end    main        ;конец программы
 

Всего записей: 38 | Зарегистр. 03-08-2009 | Отправлено: 14:07 18-12-2009 | Исправлено: JacobyD, 14:07 18-12-2009
aspis

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это только примерное предложение одного из вариантов, не больше. (главное - принцип метода):
1 находим все множители числа;
2 выбираем те из них, которые являются простыми числами;
 

Код:
 
.386
.model flat,stdcall
option casemap:none
 
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
 
.const
    N=16
.data
    sz db 'End',0
    sz2 db 2 dup(0),13,10,0
          ; таблица сокращена
    simNom    dw 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101
            dw 103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199
            dw 211,223,227,229,233,239
    DivCount dd 0  ; кол-во множителей-простых чисел
.data?
    hIn    dd ? ; нужно для чтения-записи
    hOut dd ?
    szCount db 2 dup(0),0  ; куда записываем, вводить можно две циры - 06, 23, 30
    tmp dd ?
    Divider db ? ; делитель
    simDiv    dw ? ; массив для записи множителей-простых чисел
    
.code
start:
    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov hOut,eax
    invoke GetStdHandle,STD_INPUT_HANDLE
    mov hIn,eax
    invoke ReadConsole,hIn,addr szCount,2,addr tmp,NULL ; вводим число
    invoke atodw,offset szCount ; преобразуем строку в число
    mov dx,ax ; сохраняем число
    xor eax,eax
    xor ecx,ecx
; ищем все делители, с 1 до самого этого числа
    mov Divider,1 ; начинаем с единицы
    mov cx,dx
    .while cl!=Divider ; проверяем все возможные числа как делители числа
        lea esi,simNom     ; табл простых чисел
        lea edi,simDiv  ; табл-массив для записи множителей-простых чисел
        xor ebx,ebx
        mov bl,Divider  ; текущий делитель
        mov ax,dx
        div Divider  ; делим число на текущий делитель
        .if ah==0  ; если без остатка, то данное число, множитель, дальше проверяем уже этот множитель - простой он или нет, для этого проверяем, входит ли множитель в таблицу простых чисел
            mov ax,[esi]
            .while ax!=0
                .if bx==[esi]  
                    inc DivCount ; если входит, то увеличиваем счетчик множителей
                    mov [edi],bx ; копируем в массив множителей
                    add edi,2
                .endif
                mov ax,[esi]
                add esi,2                
            .endw
                       ; .... тут нужно уже просто преобразовать числа из массива множителей в строки и вывести на экран
        .endif
        inc Divider
    .endw
         ; выводим только общее кол-во множителей-простых чисел
    invoke dwtoa,DivCount,offset sz2
    invoke WriteConsole,hOut,addr sz2,2,addr tmp,NULL
    invoke Sleep,3000
    invoke ExitProcess,0
end start
 

Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 22:22 19-12-2009
   

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Assembler [простые множители числа]
ShIvADeSt (21-12-2009 02:50): http://forum.ru-board.com/topic.cgi?forum=33&topic=7682&start=580#lt


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru