نمایش نتایج 1 تا 4 از 4

نام تاپیک: اعداد اول بین دو عدد ورودی

  1. #1

    Question اعداد اول بین دو عدد ورودی

    سلام

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

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

  2. #2

    نقل قول: اعداد اول بین دو عدد ورودی

    مشکل حل شد ولی نمیدونم چرا دو تا عدد رو از ورودی چرا نمیگیره

    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

  3. #3

    نقل قول: اعداد اول بین دو عدد ورودی

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

    میدونم حلقه میخواد ولی نمیدونم کجاش رو باید تغییر بدم.
    کاری که شما باید انجام بدین یا باید محاسبه کنید اعداد اول رو بدست بیارین(برای عدد بزرگتر) بعد بررسی کنید ،اگر prim بزرگتر از عدد دوم هست نمایش بدین،البته این روش زمان بر هست یا اینکه روش دور زدن استفاده کنید
    The First 10,000 Primes
    این لیست رو در آرایه ای قرار بدین و بین دو عدد رو نمایش بدین که نیاز به جستجو عدد کوچکتر در لیست و نمایش و بعد چک کردن اعداد بعدی با عدد دوم تا زمانی که کوچکتر هست نمایش بدین
    موفق باشی

  4. #4

    نقل قول: اعداد اول بین دو عدد ورودی

    مشکل حل شد ولی نمیدونم چرا دو تا عدد رو از ورودی چرا نمیگیره
    مشکلتون در استفاده از وقفه برای گرفتن بافر هست یه مثال زیر توجه کنید

    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 قرار میگره
    بعد از گرفتن این بافر اونو تبدیل به عدد کنید بعد محاسبتون رو انجام بدین
    موفق باشی

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •