水柔炎 发表于 2019-6-18 11:25:39

键盘上分别输入3个小于99的两位十进制数,把其中数值最大的数以二进制形式显示出来

那位大佬可以求求我,就像图片张的那样,但要以二进制输出

凌九霄 发表于 2019-6-18 11:44:01

本帖最后由 凌九霄 于 2019-6-18 11:51 编辑

l = []
for i in ['first', 'second', 'third']:
    t = int(input('Please ebter a decimal number {}:'.format(i)))
    l.append(t)

print('The maximum value is:', bin(sorted(l)[-1]))

水柔炎 发表于 2019-6-18 11:52:14

凌九霄 发表于 2019-6-18 11:44


用汇编语言写(8086),不过还是谢谢你的解答

凌九霄 发表于 2019-6-18 11:53:34

水柔炎 发表于 2019-6-18 11:52
用汇编语言写(8086),不过还是谢谢你的解答

抱歉,没注意到{:10_277:}

水柔炎 发表于 2019-6-18 11:55:42

凌九霄 发表于 2019-6-18 11:53
抱歉,没注意到

没事,谢谢你

暗pluto 发表于 2019-6-18 15:27:28

我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存起来,输入回车结束(其中可以再设置一个错误输入重新输入的函数)
2.得到三个数的ASCII码后,接下来就是比较了,可以把得到的数的十位数先比较,如果相同,再比较个位数,这样可以得到最大的数,记得保存输入得到的字符要以字的形式存放,这样,如果输入的只有一位数,可以把高位置0
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的16进制ASCII码为30h~39h),然后十位再乘于10h,得到一个16进制的最大数
4.最后一步,把16进制变为2进制,首先,利用循环左移rol,它可以把最高位的数给进位寄存器CF,利用这个特点,我们可以得到16进制数的二进制
设置循环次数,16次,然后循环左移你得到的最大数,然后把dl置为0,adc dl,30h(因为最高位保存在CF中,adc可以把CF中的内容加进来,30h是变成ASCII码的形式,方便输出),调用int 21h的2号功能,输出
还有什么不懂的可以问,思路在这里了

人造人 发表于 2019-6-18 20:52:07

assume cs:code, ds:data

stack segment
        db 512 dup(0)
stack ends

data segment
msg1        db 'Please enter a decimal number first: ', 0
msg2        db 'Please enter a decimal number second: ', 0
msg3        db 'Please enter a decimal number third: ', 0
msg4        db 'The maximum value is: ', 0
data ends

code segment
; void put_char(char ch)
; ax: ch
put_char:
        mov        dl, al
        mov        ah, 2
        int        21h
        ret
       
; void put_string(const char *str)
; ax: str
put_string:
        push        bx
        mov        bx, ax
        xor        ax, ax
@@:
        mov        al,
        cmp        al, 0
        je        @F
        call        put_char
       
        inc        bx
        jmp        @B
@@:
        pop        bx
        ret
       
; uint16_t get_number(void)
get_number:
        push        bx
        push        si
       
        xor        si, si
        xor        bx, bx
@@:
        mov        ah, 1        ; 键盘输入
        int        21h
        mov        bl, al
        cmp        bl, 0dh
        je        @F
       
        ; si = si * 10 + 当前数位上的数字
        mov        ax, 10
        xor        dx, dx
        mul        si
        mov        si, ax
        sub        bx, '0'
        add        si, bx
        jmp        @B
@@:
        mov        ax, 0ah                ; newline
        call        put_char
       
        mov        ax, si
        pop        si
        pop        bx
        ret
       
; uint16_t max(uint16_t a, uint16_t b)
; ax: a
; cx: b
max:
        cmp        ax, cx
        ja        @F
        mov        ax, cx
@@:
        ret
       
; void print_binary(uint16_t a)
; ax: a
print_binary:
        push        bx
        push        si
       
        mov        bx, ax
        mov        cx, 16
        mov        si, 8000h
L1:
        mov        ax, '0'
        test        bx, si
        jz        @F
        mov        ax, '1'
@@:
        push        cx
        call        put_char
        pop        cx
       
        shr        si, 1
        loop        L1
       
        pop        si
        pop        bx
        ret
       
start:
        mov        ax, stack
        mov        ss, ax
        mov        sp, 512
        mov        ax, data
        mov        ds, ax
       
        mov        ax, offset msg1
        call        put_string
        call        get_number
        push        ax
       
        mov        ax, offset msg2
        call        put_string
        call        get_number
        push        ax
       
        mov        ax, offset msg3
        call        put_string
        call        get_number
       
        pop        cx
        call        max
        pop        cx
        call        max
        push        ax
       
        mov        ax, offset msg4
        call        put_string
        pop        ax
        call        print_binary
       
        mov        ax, 4c00h
        int        21h
code ends
end start

D:\Masm615>main
Please enter a decimal number first: 15
Please enter a decimal number second: 99
Please enter a decimal number third: 98
The maximum value is: 0000000001100011
D:\Masm615>

水柔炎 发表于 2019-6-19 13:05:21

暗pluto 发表于 2019-6-18 15:27
我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存 ...

好的,谢谢啦,我已经做好了
data segment
A db 0
B db 0
D db 0
buf db 3
      db 0
inn db 3 dup(0)
msg0 db 0dh, 0ah, 'Please enter a decimal number(10-99):$'
msg1 db 0dh, 0ah, 'The max number (in Binary) is :$'
data ends

assume cs:code, ds:data
code segment
start:
mov ax, data
mov ds, ax

lea si, A
call readdecimal
lea si, B
call readdecimal
lea si, D
call readdecimal

xor bx, bx
mov al, A
cmp al, B
ja m1   ;A>B
cmp al, D ;A<B
ja m4   ;B>A>D
mov al, B ;B>A, D>A, B>D?
cmp al, D
ja m5   ;B>D>A
mov bl, D
jmp printit

m1: ;A>B, then judge B>D?
mov al, B
cmp al, D
jb m2   ; B<D
mov bl, A ; found it, then print it
jmp printit

m2:;A>B, D>B, then judge A>D?
mov al, A
cmp al, D
jam3   ;A>D, found D
mov bl, D ;A<D, found A
jmp printit

m3:
mov bl, A
jmp printit

m4:
mov bl, B
jmp printit
m5:
mov bl, B
jmp printit
printit:
mov ah,9
lea dx, msg1
int 21h
call printbin

mov ax, 4c00h
int 21h

;read decimal
;store to (si)
readdecimal proc near
lea dx, msg0
mov ah, 9
int 21h

lea dx, buf
mov ah,10
int 21h

mov byte ptr , 0
mov dl, 10
xor cx, cx
mov cl, buf+1
xor bx, bx
r0:
mov al, inn
and al, 0fh
xchg al,
mul dl
add , al
inc bx
loop r0
   
ret
readdecimal endp

;print(bx)
printbin proc near
mov cx, 16
mov ah,0eh
p0:
rol bx, 1
mov al, bl
and al, 01h
xor al,30h
int 10h
loop p0
ret
printbin endp
code ends
end start

你看看有没有问题

水柔炎 发表于 2019-6-19 13:07:11

人造人 发表于 2019-6-18 20:52


谢谢你亲自动手把代码都写出来了,
你看看我上面发的代码,有没有错误的地方

人造人 发表于 2019-6-19 13:55:59

水柔炎 发表于 2019-6-19 13:07
谢谢你亲自动手把代码都写出来了,
你看看我上面发的代码,有没有错误的地方

从结果来看,应该没有问题

水柔炎 发表于 2019-6-19 13:57:06

人造人 发表于 2019-6-19 13:55
从结果来看,应该没有问题

能说一下你代码的思路吗?

水柔炎 发表于 2019-6-19 14:02:30

暗pluto 发表于 2019-6-18 15:27
我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存 ...

能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的16进制ASCII码为30h~39h),然后十位再乘于10h,得到一个16进制的最大数
十位为什么要再乘以10h??

人造人 发表于 2019-6-19 16:03:16

水柔炎 发表于 2019-6-19 14:02
能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的 ...

你那里不明白吗?
能理解这个代码吗?

#include <stdio.h>
#include <stdint.h>

uint32_t get_number(void)
{
        int ch;
        uint32_t res = 0;
        while((ch = getchar()) != '\n')
                res = res * 10 + (ch - '0');
        return res;
}

int main(void)
{
        printf("Please enter a decimal number first: ");
        uint32_t res = get_number();
        printf("%u\n", res);
        return 0;
}

水柔炎 发表于 2019-6-19 16:49:14

人造人 发表于 2019-6-19 16:03
你那里不明白吗?
能理解这个代码吗?

uint32_t 这个是什么类型的?然后你是看了编译后的代码吗

人造人 发表于 2019-6-19 17:40:45

水柔炎 发表于 2019-6-19 16:49
uint32_t 这个是什么类型的?然后你是看了编译后的代码吗

//
// stdint.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// The C Standard Library <stdint.h> header.
//
#pragma once
#define _STDINT

#ifndef RC_INVOKED

#include <vcruntime.h>



typedef signed char      int8_t;
typedef short            int16_t;
typedef int                int32_t;
typedef long long          int64_t;
typedef unsigned char      uint8_t;
typedef unsigned short   uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

typedef signed char      int_least8_t;
typedef short            int_least16_t;
typedef int                int_least32_t;
typedef long long          int_least64_t;
typedef unsigned char      uint_least8_t;
typedef unsigned short   uint_least16_t;
typedef unsigned int       uint_least32_t;
typedef unsigned long long uint_least64_t;

typedef signed char      int_fast8_t;
typedef int                int_fast16_t;
typedef int                int_fast32_t;
typedef long long          int_fast64_t;
typedef unsigned char      uint_fast8_t;
typedef unsigned int       uint_fast16_t;
typedef unsigned int       uint_fast32_t;
typedef unsigned long long uint_fast64_t;

typedef long long          intmax_t;
typedef unsigned long long uintmax_t;

// These macros must exactly match those in the Windows SDK's intsafe.h.
#define INT8_MIN         (-127i8 - 1)
#define INT16_MIN      (-32767i16 - 1)
#define INT32_MIN      (-2147483647i32 - 1)
#define INT64_MIN      (-9223372036854775807i64 - 1)
#define INT8_MAX         127i8
#define INT16_MAX      32767i16
#define INT32_MAX      2147483647i32
#define INT64_MAX      9223372036854775807i64
#define UINT8_MAX      0xffui8
#define UINT16_MAX       0xffffui16
#define UINT32_MAX       0xffffffffui32
#define UINT64_MAX       0xffffffffffffffffui64

#define INT_LEAST8_MIN   INT8_MIN
#define INT_LEAST16_MININT16_MIN
#define INT_LEAST32_MININT32_MIN
#define INT_LEAST64_MININT64_MIN
#define INT_LEAST8_MAX   INT8_MAX
#define INT_LEAST16_MAXINT16_MAX
#define INT_LEAST32_MAXINT32_MAX
#define INT_LEAST64_MAXINT64_MAX
#define UINT_LEAST8_MAXUINT8_MAX
#define UINT_LEAST16_MAX UINT16_MAX
#define UINT_LEAST32_MAX UINT32_MAX
#define UINT_LEAST64_MAX UINT64_MAX

#define INT_FAST8_MIN    INT8_MIN
#define INT_FAST16_MIN   INT32_MIN
#define INT_FAST32_MIN   INT32_MIN
#define INT_FAST64_MIN   INT64_MIN
#define INT_FAST8_MAX    INT8_MAX
#define INT_FAST16_MAX   INT32_MAX
#define INT_FAST32_MAX   INT32_MAX
#define INT_FAST64_MAX   INT64_MAX
#define UINT_FAST8_MAX   UINT8_MAX
#define UINT_FAST16_MAXUINT32_MAX
#define UINT_FAST32_MAXUINT32_MAX
#define UINT_FAST64_MAXUINT64_MAX

#ifdef _WIN64
    #define INTPTR_MIN   INT64_MIN
    #define INTPTR_MAX   INT64_MAX
    #define UINTPTR_MAXUINT64_MAX
#else
    #define INTPTR_MIN   INT32_MIN
    #define INTPTR_MAX   INT32_MAX
    #define UINTPTR_MAXUINT32_MAX
#endif

#define INTMAX_MIN       INT64_MIN
#define INTMAX_MAX       INT64_MAX
#define UINTMAX_MAX      UINT64_MAX

#define PTRDIFF_MIN      INTPTR_MIN
#define PTRDIFF_MAX      INTPTR_MAX

#ifndef SIZE_MAX
    #define SIZE_MAX   UINTPTR_MAX
#endif

#define SIG_ATOMIC_MIN   INT32_MIN
#define SIG_ATOMIC_MAX   INT32_MAX

#define WCHAR_MIN      0x0000
#define WCHAR_MAX      0xffff

#define WINT_MIN         0x0000
#define WINT_MAX         0xffff

#define INT8_C(x)    (x)
#define INT16_C(x)   (x)
#define INT32_C(x)   (x)
#define INT64_C(x)   (x ## LL)

#define UINT8_C(x)   (x)
#define UINT16_C(x)(x)
#define UINT32_C(x)(x ## U)
#define UINT64_C(x)(x ## ULL)

#define INTMAX_C(x)INT64_C(x)
#define UINTMAX_C(x) UINT64_C(x)



#endif // RC_INVOKED

/*
* Copyright (c) 1992-2012 by P.J. Plauger.ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V6.00:0009 */



typedef unsigned int       uint32_t;



我不知道应该如何给你解释这个
res = res * 10 + (ch - '0');

qq: 1440332527

暗pluto 发表于 2019-6-20 11:12:15

水柔炎 发表于 2019-6-19 14:02
能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的 ...

因为保存的是10位数一个位数,而不是真正的十位,例如:11    在代码中,十位保存的是1,而不是10,所以要乘10,把1变成真正的10位数

水柔炎 发表于 2019-6-20 21:54:45

暗pluto 发表于 2019-6-20 11:12
因为保存的是10位数一个位数,而不是真正的十位,例如:11    在代码中,十位保存的是1,而不是10,所以 ...

你乘以的应该是十进制的10,应该是10,不要H吧
第四部怎么理解呢?
页: [1]
查看完整版本: 键盘上分别输入3个小于99的两位十进制数,把其中数值最大的数以二进制形式显示出来