鱼C论坛

 找回密码
 立即注册
查看: 3575|回复: 4

求大数阶乘,思路应该没错,但是求15以上的阶乘时会卡住

[复制链接]
发表于 2020-4-30 15:23:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1.   .MODEL SMALL,STDCALL
  2.   .386
  3.    

  4.   .DATA
  5.   digit db 0
  6.   n     db ?
  7.   i     db 0
  8.   j     db 0
  9.   num   db 0
  10.   array db 10000 dup(0)


  11.    
  12.   .CODE
  13.   main proc
  14.     ;装载数据段地址
  15.     mov ax,@data
  16.     mov ds,ax

  17. ;-----------------把输入存到n中
  18.     mov  bx, 0
  19.     Newchar:
  20.       mov  ah, 1
  21.       int  21h
  22.       sub  al, 30h
  23.       jl  endinput
  24.       cmp  al, 9   
  25.       jg  endinput
  26.       cbw  
  27.       xchg   ax, bx
  28.       mul   cx
  29.       xchg  ax, bx   
  30.       add   bx, ax
  31.       jmp   newchar
  32.     endinput:
  33.     mov n,bl
  34. ;-----------------


  35.     mov al,1
  36.     mov array[0],al

  37.     mov al,1
  38.     mov digit,al

  39.     mov ch,0
  40.     mov cl,n
  41.     sub cl,2
  42.     firstloop:
  43.       ;i = n - cx = al
  44.       mov ah,0
  45.       mov al,n
  46.       sub ax,cx
  47.       mov i,al
  48.       ;num = 0 = dl,dh也用了
  49.       mov dh,0
  50.       mov dl,0
  51.       mov num,dl

  52.       ;------------ j = 0 = bx
  53.       mov bx,0
  54.       secondloop:
  55.         ; --------temp=a[j]*i+num;
  56.         mov al,i
  57.         mov ah,array[bx]
  58.         mul ah;->ax
  59.         add ax,dx
  60.         mov dh,10;暂时借用dh,一会儿要再改回dh=0
  61.         div dh
  62.         ; ----------a[j]=temp%10;
  63.         mov array[bx],ah
  64.         ; -----------num=temp/10;
  65.         mov dl,al
  66.         mov num,dl
  67.         mov dh,0

  68.         add bx,1
  69.         mov j,bl
  70.         cmp bl,digit
  71.         jl secondloop

  72.       whileloop:
  73.         mov dl,num
  74.         mov dh,0
  75.         cmp dx,0
  76.         je tonext
  77.         mov ax,dx
  78.         mov dh,10;暂时借用dh,一会儿要再改回dh=0
  79.         div dh
  80.         mov dh,0
  81.         mov j,bl
  82.         mov bh,0;原本bx是j,暂时改成digit
  83.         mov bl,digit
  84.         mov array[bx],ah
  85.         ; num=num/10;
  86.         mov dl,al
  87.         ; digit++;
  88.         add bl,1
  89.         mov digit,bl
  90.         mov bl,j;还原bx的值j

  91.         cmp dx,0
  92.         jne whileloop

  93.       tonext:
  94.         mov al,i
  95.         add al,1
  96.         mov i,al
  97.         sub cx,1
  98.         cmp al,n
  99.         jle firstloop




  100.       ; ------------逆序打印一下
  101.       mov bh,0
  102.       mov bl,digit
  103.       sub bl,1
  104.       
  105.     printloop:
  106.       MOV  DL,array[bx]
  107.       add dl,30h
  108.       mov ah,2
  109.       int 21h
  110.       sub bx,1
  111.       cmp bx,0
  112.       jnl printloop

  113.       jmp exit;

  114.     exit:
  115.       mov ah,4ch
  116.       int 21h
  117.     main endp
  118.     end main
复制代码

原文链接:https://blog.csdn.net/lisp1995/article/details/52403507

编译用的是MASM,我基本是完全照搬上边这篇文章的思路,只是c语言改写成汇编
(应该有些地方不用把寄存器数据写回到数据段,我这里为了跑通写的繁琐了,之后还可以简化)


问题:
求14以下结果输出正确,但是算15阶乘就会卡住
推测一,有些变量用db存储,会溢出,但是digit在算15!时应该只比10多一点,其他变量就更小了
推测二,来自dosbox的未知限制?这个不确定,我再debug试试

既然能算出14!,按照链接中这个思路应该更大的也可以算,虽然代码有点长,各位能提出建议我会很感谢的

result.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-30 15:33:57 From FishC Mobile | 显示全部楼层
超范围了啊
更换算法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 15:38:23 | 显示全部楼层
wp231957 发表于 2020-4-30 15:33
超范围了啊
更换算法

这个算法就是为了解决超范围的问题吧(?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 15:43:28 From FishC Mobile | 显示全部楼层
DarrenTitor 发表于 2020-4-30 15:38
这个算法就是为了解决超范围的问题吧(?

你这代码16位的?,不都是eax   ebx   ecx   edx
64位的,没玩过,不知道是啥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 08:48:07 | 显示全部楼层
超过位数了,就使用多个寄存器或者多个内存单元分别存放数的高位和低位,目前没有必要做这种题目,理解循环指令的工作流程即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 16:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表