0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 30
|
||||||
1 | ||||||
Найти все трёхзначные числа, большие квадрата суммы своих цифр. Исправить код30.04.2017, 21:24. Показов 1432. Ответов 15
Метки нет (Все метки)
P.S. В прошлый раз не так условие поняла
0
|
30.04.2017, 21:24 | |
Ответы с готовыми решениями:
15
Найти все трехзначные числа,равные кубу суммы своих своих цифр. Найти все трехзначные числа, каждое из которых в 19 раз больше суммы своих цифр Найти все натуральные трехзначные числа, каждое из которых в 19 раз больше суммы своих цифр. Найти все трёхзначные числа, равные сумме кубов своих цифр |
Модератор
|
||||||
30.04.2017, 22:48 | 2 | |||||
Вы в асм вставке переменной цикла выбрали ecx, а проверку делаете для переменной b (строки 19, 26).
Ну и как-то сложно вы выполняете проверку. Сделал без проверки - т.к. нет VS.
0
|
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 30
|
|
01.05.2017, 00:35 [ТС] | 3 |
ФедосеевПавел,Мне выдаёт число 100, а дальше прога вылетает. Продебажила выдаёт ошибку на 13 строке (integer overflow). Понятно, что что-то с регистрами при делении, но как это исправить?
0
|
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
|
|
01.05.2017, 06:15 | 4 |
Ничего, что после 26 строки регистр ecx изменяется? А раз
значит он > 1000
0
|
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|
01.05.2017, 07:36 | 5 |
мановар,
вылетает потому, что edx заполняется командой cdq, а пара edx:eax делится командой div (противоречия никто не заметил? ) а вообще переполнение (divide by zero) будет всегда, когда делитель меньше или равен AH/DX/EDX/RDX По условию задачи, для начала, нужно отсеять числа больше чем 243=3*92 (максимальная сумма квадратов цифр), а уже потом сравнивать оставшиеся числа с сумой квадратов
0
|
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
|
|
01.05.2017, 07:50 | 6 |
Сообщение было отмечено ФедосеевПавел как решение
Решение
Mikl___, проверял через отладчик. Если сохраняешь ecx, а потом восстанавливаешь, то все начинает работать (до определенного момента, дальше не разбирался, хотя догадываюсь почему).
<offtop> быстро пробежался отладчиком, увидел косяк с ecx и <offtop> не стал вникать не то что в детали, даже в саму программу.
0
|
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 30
|
|
01.05.2017, 10:22 [ТС] | 7 |
мановар, Да нет же! Признаю, что косяк был, но что мне делать, если я хочу разобраться с задачей, но НЕ МОГУ это сделать самостоятельно? Пожалуйста, подскажите, где eaх восстанавливать?
0
|
Модератор
|
||||||
01.05.2017, 10:50 | 8 | |||||
замените в моём коде строку 12 на
mov edx,0 Mikl___, мановар, обратите внимание, что эта задача отличается от другой темы топикстартера. Здесь нужно возвести в квадрат сумму цифр, а не получить сумму квадратов цифр. Добавлено через 9 минут Ерунда какая-то. Хотел обойтись одними регистрами, но, видимо, придётся добавлять переменные.
1
|
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
|
|
01.05.2017, 11:16 | 9 |
Да заметели как то.
Не надо. У нас есть b = 100, ее и инкриминировать поэтому строки 1,4, 5 лишние стр.7 mov ecx, b стр.33 inc b Только подозреваю это еще не все. Добавлено через 6 минут К стати, если строку 15 mov edx, 0 заменить на cdq, все прекрасно работает.
1
|
Модератор
|
|||||||||||
01.05.2017, 12:16 | 10 | ||||||||||
На masm32
Проблема в том, что вызов WinAPI разрушает содержимое регистров. Нужно перед вызовом функции печати сохранить все регистры pushad /popad .Добавлено через 5 минут Нет, не все числа - сорок чисел не подходят (119, 129, 138, ..., 399). И, наверное, так на C++
мановар, да, т.к. числа трёхзначные, можно применять cdq , как я вначале и пытался.По поводу использования b вместо i - я бы предпочёл использовать i, т.к. b и border могут быть объявлены константами. Но это вкусовщина. Добавлено через 3 минуты Хотел поставить +1 в сообщение о порче регистров - т.к. оно ключевое для решения, но там обидные для ТС размышления. Может сложится превратное суждение о том, что заслужило оценку. Удалю лишнее и поставлю.
0
|
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
|
|
01.05.2017, 12:16 | 11 |
Число 119 ---> (1 + 1 + 9)^2 = 11^2=121 (к примеру)
Только я думаю, что вот эти числа и надо было выводить, которые не больше. Их как раз и не много.
1
|
Модератор
|
|
01.05.2017, 12:26 | 12 |
Да, изменив условие для вывода (masm32 строка 81) на
ja @@Next получаю на выходе 40 чисел.Но с этим пусть уже ТС разбирается. Постановка задачи идёт от него.
0
|
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 30
|
|
01.05.2017, 13:49 [ТС] | 13 |
ФедосеевПавел, мановар, нет, условие теперь точно правильное) Согласна, лучше было б выводить те 40 чисел, но не я придумываю задачи, а препод. Спасибо, за код, за время, за объяснения. Надеюсь, больше косяков не будет.
0
|
Модератор
|
|
01.05.2017, 15:03 | 14 |
Теперь работает? Т.к. у меня нет VS - даже проверить не могу (проверял только в masm32).
0
|
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
|
|
01.05.2017, 15:36 | 15 |
ФедосеевПавел, по моему и в 8 пост. работал.
0
|
Модератор
|
|
01.05.2017, 16:36 | 16 |
Тот #8 мог и не работать, т.к. содержимое регистров разрушалось при выводе на печать. А позже я обрамил вывод сохранением и восстановлением регистров.
0
|
01.05.2017, 16:36 | |
01.05.2017, 16:36 | |
Помогаю со студенческими работами здесь
16
Найти все трёхзначные числа, равные сумме факториала своих цифр Найти все трехзначные числа, равные сумме квадратов своих цифр Найти все трехзначные числа, делящиеся на сумму своих цифр. PHP Найти все трехзначные числа, равные сумме кубов своих цифр Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |