PDA

Просмотр полной версии : Help me please!



G1z
13.01.2007, 12:24
Народ в ближайшее время нужно решение этой задачи на ассемблере.Буду благодарен.
Для многочлена P(x) ненулевой степени с целыми коэфициентами,старший из которых положителен , и любого
натурального числа к найти такое целое число m,что числа P(m),P(m+1),...,P(m+k) - составные.

somewhere
15.01.2007, 13:14
А где-ж сам многочлен-то? А то получается чисто математическая задача с ответом в общем виде...

G1z
15.01.2007, 21:45
Я так понимаю что и многочлен я должен сам ввести...

somewhere
16.01.2007, 14:06
Могу написать только основной алгоритм. Что разрешаеться использовать в программе (какие инструкции?
- 386 и больше?
- Fpu?
- 32 разрядные регистры?
или все для старичка 286? ;-)

G1z
18.01.2007, 00:05
Ага он самый...думаешь в инсте что то получше стоять будет

somewhere
18.01.2007, 13:39
1. Предполагается, что значение многочлена либо A*X^N в диапазоне от -32768..32767.
2. Использование 32 разрядных регистров расширит этот диапазон во много раз, сократит код проц. на 30%
3. Использование команд 386 и выше сократит код еще проц. на 50.
4. Использование FPU практически уберет ограничение на диапазон, сократит код проц. на 10%.
5. Предполагается, что коэф. уже введены пользователем.



model tiny
org 100h

.code
push cs
pop ds
mov bx, start_m ; начальное значение M для поиска
@loop1:
mov cx, k
@loop:
mov ax, bx
add ax, cx
call Calculate ; вычисляем выражение P(Ax)
call IsSostavnoe ; оно составное?
jnc @simple ; ну раз нет, значит дальше нехрена делать
loop @loop
@simple:
or cx, cx ; цикл прервался преждевременно?
jnz @simple1 ; если нет, то все значения составные
mov ax, bx
call wnum ; и их надо на экран
mov ah, 2
mov dl, ',' ; и запятую еще
int 21h
@simple1: ; ну а если прервался, значит к следующему диапазону [bx; bx+k]
inc bx
cmp bx, end_m
jnz @loop1

mov ax, 4C00h ; все сделали, с вещами на выход...
int 21h

;--------- Для подсчета значения многочлена P(ax)
;--------- На входе в AX - параметр
;--------- На выходе в AX - значение
Calculate proc near
push bx
push cx
push dx
push si
push di
push bp
pushf
mov si, offset coefs
mov cl, Level
xor ch, ch
add si, cx
add si, cx
sub si, 2 ; На последний коэф.
xor di, di ; Начальная сумма - 0
mov bx, 1 ; Начальная степень AX^0
mov bp, ax ; Сохраняем пар.
@pow:
mov ax, bx
imul word ptr [si]
add di, ax ; Умножение на коэф.
mov ax, bx
imul bp
mov bx, ax ; Переход к следующей степени параметра
sub si, 2
loop @pow
mov ax, di ; Результат в DI
popf
pop bp
pop di
pop si
pop dx
pop cx
pop bx
retn
Calculate endp

; ---------------- Составное или нет
; ---------------- На входе AX - число
; ---------------- На выходе CF=1 если составное, иначе - нет
IsSostavnoe proc near
push ax
push bx
push cx
push dx
or ax, ax
js @prost ; А если отрицательное, то хрен знает - простое или составное. Наверное простое
cmp ax, 4
jc @prost ; Меньше 4 - точно простое
mov cx, ax
mov bx, 2 ; Начальный делитель для числа AX
@div:
xor dx, dx
mov ax, cx
div bx
or dx, dx ; Проверяем остаток - если 0, значит делится нацело
jz @sost
inc bx
cmp bx, cx
jnz @div
@prost: ; не на что кроме 1 и самого себя не делится, значит простое
clc
pop dx
pop cx
pop bx
pop ax
retn
@sost:
stc
pop dx
pop cx
pop bx
pop ax
retn
IsSostavnoe endp

; -------- это для печати чисел
; -------- в AX - число (беззнаковое)
wnum proc far
pushf
push bx
push cx
push dx
mov bx,10
xor cx,cx
wnum_1:
xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz wnum_1
wnum_2:
pop dx
add dl,30h
mov ah,2
int 21h
loop wnum_2
pop dx
pop cx
pop bx
popf
retf
wnum endp

start_m dw 0
end_m dw 20
m dw ?
k dw 5
level db 4 ; количество коэф.
coefs dw 4, 3, -7, -6 ; коэфф. многочлена
end

Have not tested...

G1z
19.01.2007, 12:54
Премного благодарен!Очень помогло.

G1z
19.01.2007, 12:54
Возможно, в ближайшее время появится еще одна задача.