PDA

View Full Version : اعداد اول بین دو عدد ورودی



Collector
شنبه 03 دی 1390, 14:43 عصر
سلام

برنامه زیر یک عدد رو میگیره و میگه اول هست یا نه
حالا من میخوام دو عدد بگیرد و اعداد اول بین آن دو را حساب کند.

میدونم حلقه میخواد ولی نمیدونم کجاش رو باید تغییر بدم.

Collector
شنبه 03 دی 1390, 18:19 عصر
مشکل حل شد ولی نمیدونم چرا دو تا عدد رو از ورودی چرا نمیگیره

include 'emu8086.inc'

;org 100h ; set location counter to 100h

min dw 10
max dw 20

print_new_line macro
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
mov ah, 2
int 21h
endm

mov dx, min
mov ah, 0ah
int 21h ;Input min

mov dx, max
mov ah, 0ah
int 21h ;Input max

print_new_line

jmp CodeStart

DataStart:

space db " ", 0

CodeStart:

mov bx, min

call IsPrime
cmp dx, 0

LoopStart:

;call IsPrime to test if the number is a prime number or not
call IsPrime

;compare to zero
cmp dx, 0

;if equal to zero jump to EndLoop
je EndLoop

;if not equal to zero continue program
; must be a prime
mov ax, bx

call PRINT_NUM

; print a space
mov si, offset space
call print_string

EndLoop:
add bx, 1
cmp bx, max

jle LoopStart

ret


IsPrime PROC
; uses a loop to determine if number in bx is prime
; upon return if bx not prime dx will be 0, otherwise dx > 0

; we only have to test divisors from 2 to bx/2

; prepare to divide dx:ax / 2
mov ax, bx
mov dx, 0
mov cx, 2
div cx

; move result into si for loop
mov si, ax

; assume the value is prime
mov dx, 1

; start loop at 2
mov cx, 2

PrimeLoop:

; compare loop count(in cx) and max loop value (in si)
cmp cx, si

; jump out of loop if count(cx) > si
ja StopLabel

; divide test value (in bx) by loop count (in cx)
mov ax, bx
mov dx, 0
div cx

; check remainder (in dx), if zero then we found a divisor
; and the number cannot be prime
cmp dx, 0

; if dx = 0 then we found a divisor and can stop looking
je StopLabel

; increment count
add cx, 1

jmp PrimeLoop

StopLabel:

ret
IsPrime ENDP




DEFINE_PRINT_STRING
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS

xman_1365_x
دوشنبه 05 دی 1390, 18:32 عصر
حالا من میخوام دو عدد بگیرد و اعداد اول بین آن دو را حساب کند.

میدونم حلقه میخواد ولی نمیدونم کجاش رو باید تغییر بدم.
کاری که شما باید انجام بدین یا باید محاسبه کنید اعداد اول رو بدست بیارین(برای عدد بزرگتر) بعد بررسی کنید ،اگر prim بزرگتر از عدد دوم هست نمایش بدین،البته این روش زمان بر هست یا اینکه روش دور زدن :لبخند: استفاده کنید
The First 10,000 Primes (http://primes.utm.edu/lists/small/10000.txt)
این لیست رو در آرایه ای قرار بدین و بین دو عدد رو نمایش بدین که نیاز به جستجو عدد کوچکتر در لیست و نمایش و بعد چک کردن اعداد بعدی با عدد دوم تا زمانی که کوچکتر هست نمایش بدین
موفق باشی

xman_1365_x
سه شنبه 06 دی 1390, 18:56 عصر
مشکل حل شد ولی نمیدونم چرا دو تا عدد رو از ورودی چرا نمیگیره
مشکلتون در استفاده از وقفه برای گرفتن بافر هست یه مثال زیر توجه کنید


org 100h
mov dx, offset buffer
mov ah, 0ah
int 21h
jmp print
buffer db 10,?, 10 dup(' ')
print:
xor bx, bx
mov bl, buffer[1]
mov buffer[bx+2], '$'
mov dx, offset buffer + 2
mov ah, 9
int 21h
ret
اولین بایت تعداد n-1 تا از ورودی میگره
دومین بایت سایز بافر رو بر میگردونه
سومی هم طول بافر - 1 که آخرینش 13 قرار میگره
بعد از گرفتن این بافر اونو تبدیل به عدد کنید بعد محاسبتون رو انجام بدین
موفق باشی