Страница 1 из 1

Help me please!

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

Re: Help me please!

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

Re: Help me please!

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

Re: Help me please!

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

Re: Help me please!

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

Re: Help me please!

Добавлено: 18 янв 2007, 13:39
somewhere
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...

Re: Help me please!

Добавлено: 19 янв 2007, 12:54
G1z
Премного благодарен!Очень помогло.

Re: Help me please!

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