Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132

Получить все четырёхзначные числа, в записи которых сумма двух левых цифр равна произведению двух правых

16.10.2011, 16:23. Показов 1950. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Задание:
Получить все натуральные четырёхзначные числа, в записи которых сумма двух левых цифр равна произведению двух правых.
Алгоритм понял, но вот не могу понять:
как исправить ошибку, в считывании последней цифры
Assembler
1
2
3
4
5
mov Ax,num
mov dl,10
div dl
mov n4,AH   
mov num, AL
такая вот ошибка:"Operand types do not match"
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2011, 16:23
Ответы с готовыми решениями:

Найти все четырёхзначные десятичные числа, у которых сумма первых двух цифр в два раза больше суммы правых двух цифр
Найти все четырёхзначные десятичные числа, у которых сумма первых двух цифр в два раза больше суммы правых двух цифр. Результат вывести в...

Вывести все четырехзначные числа у которых сумма первых двух цифр равна сумме вторых двух цифр.
5.Вывести все четырехзначные числа у которых сумма первых двух цифр равна сумме вторых двух цифр.

Найти все четырехзначные числа, у которых сумма первых двух цифр равна сумме двух последних
Найти все четырехзначные числа, у которых сумма первых двух цифр равна сумме двух последних.

13
 Аватар для 6a6kin
232 / 102 / 5
Регистрация: 18.04.2010
Сообщений: 294
16.10.2011, 16:38
Если
Assembler
1
mov Ax,num
то это не правильно:
Assembler
1
mov num, AL
Надо так:
Assembler
1
mov byte ptr num, al
Так как ax - 2 байта, а al - 1 байт.
0
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132
17.10.2011, 17:43  [ТС]
Пока что сделал кусок программы, где он считывает цифры из числа и выводит на экран, но вылетает такая вот ошибка: divide overflow

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
.model small
.stack
.data
 
msg1 db "num ne 4x znachnoe$"
n1 dw ?
n2 dw ?
n3 dw ?
n4 dw ?
num dw ?
S dw ?
M dw ?
 
.code
extrn read:near
extrn writer:near
.STARTUP
 
 
 
CALL read
mov num,Ax
 
mov Ax,num
mov dl,10
div dl
mov byte ptr n4, AH     ;записали в n4 остаток от деления на 10, т.е. 4ю цифру числа num для дальнейшей проверки
mov byte ptr num,AL     ;записали в num целую часть числа которою получили при делении на 10
mov num,Ax
cmp Ax,0                ;сравниваем число num с нулём, для того что бы проверить что число num - действительно четырёхзначное
je r                    ;если num = 0, то выводим ошибку
jmp m1                  ;если не равное нулю то идём дальше
 
m1:
mov Ax,num              
mov dl,10              
div dl
mov byte ptr n3, AH     ;записали в n3 остаток от деления на 10, т.е. 4ю цифру числа num для дальнейшей проверки
mov byte ptr num,AL     ;записали в num целую часть числа которою получили при делении на 10
mov num,Ax
cmp Ax,0                ;сравниваем число num с нулём, для того что бы проверить что число num - действительно четырёхзначное
je r                    ;если num = 0, то выводим ошибку
jmp m2                  ;если не равное нулю то идём дальше
 
m2:
mov Ax,num
mov dl,10
div dl
mov byte ptr n2, AH
mov byte ptr num,AL
mov num,Ax
cmp Ax,0
je r
jmp m3
 
m3:
mov Ax,num
mov dl,10
div dl
mov byte ptr n1, AH
mov byte ptr num,AL
mov num,Ax
cmp Ax,0
je f
jmp r
 
 
f:
mov Ax,n1
call writer
mov Ax,n2
call writer
mov Ax,n3
call writer
mov Ax,n4
call writer
 
 
r:
mov AH,9
mov dx,offset msg1
int 21h
 
 
 
 
.EXIT
END
0
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132
23.10.2011, 18:54  [ТС]
Люди помогите пожалуйста
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
23.10.2011, 22:06
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Я бы делала вот так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
.model small
.stack
.data
 
msg_len db "Число не 4-х значное...", 13, 10, '$'
msg_test    db "Printing...", 13, 10, '$'
 
thousand    dw 1000
hund        db 100
ten     db 10
 
number  dw 2423
 
S db ?
P db ?
 
.code
; extrn read:near
; extrn writer:near
 
.STARTUP
    ; call Read
    mov ax, number  ; Допустим, прочитали это число
    
    ; Сначала проверяем, что оно четырехзначное...
    ; для этого достаточно, чтобы частное от деления
    ; числа на 1000 было от 1 до 9...
    xor dx, dx
    div thousand    ; делим DX:AX на 1000
    cmp ax, 1       ; Если частное меньше 1 ...
    jl len_error
    cmp ax, 9       ; ... или больше 9, то уходим
    jg len_error
    
    ; Продолжаем работать с числом, которое прочитали
    mov ax, number
    div hund
    
    ; al - частное, т.е., 2 левые цифры
    push ax
    
    xor ah, ah
    div ten
    add al, ah
    mov S, al       ; в S - сумма двух крайних цифр слева
    
    pop ax
    
    ; ah - остаток, т.е., 2 правые цифры
    mov al, ah
    xor ah, ah
    div ten
    mul ah
    mov P, al       ; этого можно и не делать, это просто для красоты
                ; в P - произведение двух крайних цифр справа
 
    cmp al, S
    jne quit
    
    ; тут делаем с числом, хранящимся в number все, 
    ; что надо - печатаем его, сохраняем, если надо, куда-то
    ; у меня просто выводится сообщение
    mov ah, 9
    mov dx, offset msg_test
    int 21h 
 
    
    jmp quit
    
len_error:
    mov ah, 9
    mov dx, offset msg_len
    int 21h
quit:
    .EXIT
END
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
23.10.2011, 23:16
NARTZISS, divide overflow это переполнение деления. Проверьте, видимо у Вас число в num слишком велико, и при делении на 10 частное не помещается в байтовый регистр al(частное должно быть не больше 255). Переполнения можно избежать, если делить на 10 не слово(ax), а двойное слово(dx:ax). Тогда частное будет не в al, а в ax - в двухбайтовом регистре, куда результат деления четырехзначного числа на 10 гарантированно поместится.
1
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132
24.10.2011, 19:27  [ТС]
Цитата Сообщение от Ant1971on Посмотреть сообщение
NARTZISS, divide overflow это переполнение деления. Проверьте, видимо у Вас число в num слишком велико, и при делении на 10 частное не помещается в байтовый регистр al(частное должно быть не больше 255). Переполнения можно избежать, если делить на 10 не слово(ax), а двойное слово(dx:ax). Тогда частное будет не в al, а в ax - в двухбайтовом регистре, куда результат деления четырехзначного числа на 10 гарантированно поместится.
Спасибо, но я не очень понимаю как это организовать.
Пробовал, ничего не выходит. Если Вам будет не сложно покажите хотя б пример как именно можно сделать.
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
24.10.2011, 20:07
Кладете num в ax, обнуляете dx и делите двойное слово dx:ax на 10
Code
1
2
3
4
    xor dx,dx
    mov ax,num
    mov bx,10
    div bx
Частное будет в ax, остаток в dx.
1
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132
24.10.2011, 21:05  [ТС]
Всем спасибо, но для окончания лабораторной работы мне нужно перебрать все натуральные четырёхзначные цифры.
Каким образом организовать такой цикл?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
24.10.2011, 21:45
Цитата Сообщение от NARTZISS Посмотреть сообщение
перебрать все натуральные четырёхзначные цифры
Числа, а не цифры...

От 1000 до 9999 - ровно 9000 чисел.

Assembler
1
2
3
4
5
6
7
8
mov ax, 1000 ; Ну, или в любое другое хранилище, можно в переменную
mov cx, 9000
my_loop:
 
; тут работаешь с числом из AX
 
inc ax
loop my_loop
1
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132
24.10.2011, 22:52  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Числа, а не цифры...
Ошибочка вышла.

Пробовал так делать как Вы написали, ничего не выходит, хочу что бы выводило все четырёхзначные числа, которые удовлетворяют условию. Но почему-то не получается.

Вот код, если кому будет не сложно глянуть где я допустил ошибку:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
.model small
.stack
.data
 
n1 dw ?
n2 dw ?
n3 dw ?
n4 dw ?
num dw ?
S dw 0
M dw 1
 
.code
extrn read:near
extrn writer:near
.STARTUP
 
mov ax, 1000   
mov cx, 9000
my_loop:
 
mov cx,ax    ;запишим num в сх т.к. потом теряемего первоночальное значение
 
xor dx,dx      ;считываем 4-ю цифру
mov ax,num
mov bx,10
div bx
mov n4, dx
mov num, ax
 
xor dx,dx      ;считываем 3-ю цифру
mov ax,num
mov bx,10
div bx
mov n3, dx
mov num, ax
            
xor dx,dx      ;считываем 2-ю цифру
mov ax,num
mov bx,10
div bx
mov n2, dx
mov num, ax
 
xor dx,dx      ;считываем 1-ю цифру
mov ax,num
mov bx,10
div bx
mov n1, dx
mov num, ax
 
mov ax,S      
add ax,n1
mov S,ax
mov ax,S
add ax,n2
mov S,ax      ;нашли сумму 1-й и 2-й цифры
 
mov ax,n3
imul n4
mov M,ax      ;нашли произведение 3-й и 4-й цифры
 
mov S,ax
cmp ax,M
jne r          ;если сумма равна произведению то выводим на экран num
mov ax,cx
 
r:
mov ax,cx
call writer
 
 
inc ax
loop my_loop     
 
 
.EXIT
END
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
25.10.2011, 12:19
Цитата Сообщение от NARTZISS Посмотреть сообщение
где я допустил ошибку
Первое, что бросилось в глаза, это использование для хранения числа регистра cx, тогда как он уже задействован как счетчик, для этого вполне подошел бы стек. Делить для выделения цифр достаточно 3, а не 4 раза(старшая цифра числа будет лежать в ax после третьего деления), и здесь лучше использовать цикл(зачем трижды писать одно и то же?). Со сравнением дальше напутали, каков бы ни был результат после команды сравнения, программа выводит число.

Добавлено через 20 минут
И если уж используете переменную для хранения числа(хотя зачем?), то ее нужно инициализировать в области данных (num dw 1000), а иначе у Вас проверка пойдет не с 1000, а с нуля.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
25.10.2011, 12:46
NARTZISS, внимательно ВСЕ сообщения, а не только последнее, читать не пробовал? Я ж показывала в пятом посте, как можно сделать... Вот это прекрасно выводит все четырехзначные числа, удовлетворяющие условию:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
.model small
.stack
.data
 
thousand    dw 1000
hund        db 100
ten     db 10
 
S db ?
P db ?
 
.code
; extrn read:near
extrn writer:near
 
.STARTUP
    mov bx, 1000
    mov cx, 9000
my_loop:
 
    mov ax, bx
    div hund
    
    ; al - частное, т.е., 2 левые цифры
    push ax
    
    xor ah, ah
    div ten
    add al, ah
    mov S, al           ; в S - сумма двух крайних цифр слева
    
    pop ax
    
    ; ah - остаток, т.е., 2 правые цифры
    mov al, ah
    xor ah, ah
    div ten
    mul ah
    mov P, al       ; этого можно и не делать, это просто для красоты
                ; в P - произведение двух крайних цифр справа
 
    cmp al, S
    jne next
    
    mov ax, bx      ; Печатаем текущее число (writer у меня печатает содержимое AX)
    call writer
next:
    inc bx
    loop my_loop
    .EXIT
END
Миниатюры
Получить все четырёхзначные числа, в записи которых сумма двух левых цифр равна произведению двух правых  
1
 Аватар для NARTZISS
3 / 3 / 1
Регистрация: 11.11.2009
Сообщений: 132
25.10.2011, 18:07  [ТС]
Спасибо всем большое. В особенности Ant1971on и UI.
Буду разбирать свои недочёты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2011, 18:07
Помогаю со студенческими работами здесь

Найти все четырехзначные числа, у которых сумма первых двух цифр равна сумме двух последних
Помогите решить. Описание метода решения, блок-схему алгоритма. Ввод данных должен осуществляться только из текстового файла Input.dat....

Найти все четырехзначные числа, у которых сумма первых двух цифр равна сумме двух последних.
Найти все четырехзначные числа, у которых сумма первых двух цифр равна сумме двух последних.

Найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних
найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних.

Из чисел вывести такие, в которых сумма двух левых цифр является чётным числом и равным сумме двух правых цифр
Помогите составить программу с помощью qbasic Из четырёхзначных чисел ( Целых по значению больше нуля ) вывести такие числа , в...

Найти все четырехзначные числа, такие, что сумма первых двух цифр равна сумме двух последних
найти все четырехзначные числа, такие, что сумма первых двух цифр равна сумме двух последних


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru