求助:为什么得不到想要输出的结果

jiayou21 2009-12-07 10:37:35
学习汇编不久,现在遇到了困难,希望大家可以不吝赐教,大家在讨论中共同进步!

从键盘输入任意一个不大于99的自然数,将它表示成连续自然数之和,显示在屏幕上(要求列出所有可能的序列)

data segment
buf db 3,0,3 dup(0)
str1 db "please input a number(<=99)$ "
sum dw 00
num dw 00
str2 db 30 dup(0)
data ends
code segment
assume cs:code,ds: data
start:
mov ax,data
mov ds,ax
mov dx,offset str1;显示字符串提示信息
mov ah,09h
int 21h
mov dx,offset buf;输入要表示成连续自然数之和的数
mov ah,0ah
int 21h
mov cl,buf+1;键输入数的位数存在cx
mov ch,0
push cx
mov si,offset buf+2
mov ax,0

;将输入的数转化成二进制,并存储在ax中
TenTo2:
mov dx,10
mul dx
and byte ptr [si],0fh
add al,[si]
adc ah,0
inc si
dec cl
jnz TenTo2
mov di,offset sum
mov word ptr [str2+29],'$'
;外层循环开始
mov cx,ax ;循环控制条件,也是输入的数值的二进制形式
mov bx,offset str2;bx存储显示结果的信息
mov [num],cx;保存循环空条件
mov ax,0
mov di,offset sum

loopOut:
push cx;循环控制次数
push ax
cmp ax,cx
ja exit
;内层循环
inc ax
mov dx,ax;内层循环初始值
;每次进内层循环都要将cx重新赋值
LoopIn: mov [bx],dx
add [di],dx
mov ax,[num]
cmp [di],ax
je Display
ja loopX
inc bx
dec cx
jnz loopIn
Display:
mov word ptr [str2+29],'$'
mov dx,offset str2
mov ah,09h
int 21h
loopX:
pop ax
pop cx
inc ax
jmp loopout

exit:
mov ah,4ch
int 21h
code ends
end start
...全文
140 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
源帅 2009-12-14
  • 打赏
  • 举报
回复
个人觉的可以取输入的数的一半,例如:输入99,一半就是49,从49到0之间取2个相连的数相加与99比较,相等就输出一个,大于和相等都继续寻找,小于就退出循环
请高手指正
学习中
源帅 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 versaariel 的回复:]
引用 2 楼 mydo 的回复:
5 = 1 + 2 + 2???

题目的意思好象不是这样吧。
我个人理解连续的N,是指99=49+50=32+33+34=.....很多种情况

对于奇数块来说是不是 (x-n,x-m) x (x+m,x+n) n>m 余数为0 就行了
偶数的是不是根据奇偶的性质来的?
比如:
99/3:33 33 33 -> 32 33 34

99/4:24 24 24 24 mod=3
因为4个连续的自然数是2奇2偶的,而24 24 3的和为基数,两个基数的和不可能位基数,所以是不成立的。
不知道理解的对不对,不对的地方,希望大家指正。

[/Quote]
正解,学习
ip5636626 2009-12-13
  • 打赏
  • 举报
回复
用debug 自己去调试啊
Terryguy1991 2009-12-13
  • 打赏
  • 举报
回复
题目不是很清楚,麻烦楼主举 几个例子说明一下
nanlingcg 2009-12-11
  • 打赏
  • 举报
回复
人算应该很麻烦!计算机算应该不麻烦.开始创造它就是用它来干这事的.就花点时间让CPU运算下就是了.
dingdingdao 2009-12-10
  • 打赏
  • 举报
回复
关注
versaariel 2009-12-10
  • 打赏
  • 举报
回复
学习了
suchx 2009-12-10
  • 打赏
  • 举报
回复
suchx 2009-12-10
  • 打赏
  • 举报
回复
这个貌似是Ramanujan分划数的问题,问N个石子能分几堆,例如5=1+4=1+1+3=2+2+1,这个问题感觉是十分困难的,不知道你能拿高级语言实现吗,然后再汇编语言实现吧。可以参考下http://zh.wikipedia.org/zh-cn/%E6%95%B4%E6%95%B8%E5%88%86%E6%8B%86
大熊猫侯佩 2009-12-08
  • 打赏
  • 举报
回复
ok!5 = 2 + 3
girllovecompter 2009-12-08
  • 打赏
  • 举报
回复
这个问题需要的是什么样的输出?
versaariel 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mydo 的回复:]
5 = 1 + 2 + 2???
[/Quote]
题目的意思好象不是这样吧。
我个人理解连续的N,是指99=49+50=32+33+34=.....很多种情况

对于奇数块来说是不是 (x-n,x-m) x (x+m,x+n) n>m 余数为0 就行了
偶数的是不是根据奇偶的性质来的?
比如:
99/3:33 33 33 -> 32 33 34

99/4:24 24 24 24 mod=3
因为4个连续的自然数是2奇2偶的,而24 24 3的和为基数,两个基数的和不可能位基数,所以是不成立的。
不知道理解的对不对,不对的地方,希望大家指正。
大熊猫侯佩 2009-12-08
  • 打赏
  • 举报
回复
5 = 1 + 2 + 2???
versaariel 2009-12-08
  • 打赏
  • 举报
回复
题目是看明白了,算法是啥我没弄明白,想了好长时间,没仔细看LZ的代码,想问问LZ的算法是怎样的,我觉得是不是根据奇数偶数的性质来求的,不过看LZ的代码不像这么做的,数学基础不好,学习+关注

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧