| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2653 人关注过本帖, 1 人收藏
标题:请教各位大师,怎么解决超大数的除法?
取消只看楼主 加入收藏
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:6 
请教各位大师,怎么解决超大数的除法?
对于有几十个数字的超大数,比如9854422144556622455625/56254455224444554之类的,怎么用字串形式,模拟手动做除法啊?
2017-03-30 11:11
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
收藏
得分:0 
我写了加减乘的(没考虑小数),大家看看。
CLEAR
ACCEPT'请输入加数:'TO x
ACCEPT'请输入被加数:'TO Y

?mjia(x,y)
?mjian(x,y)
?mcheng(x,y)



FUNCTION cn
lPARAMETERS cc
RETURN VAL(cc)
ENDFUNC

FUNCTION jia
*******************************
**单位数加
*******************************
lPARAMETERS cn1,cn2
LOCAL he
he=ALLTRIM(STR(val(cn1)+val(cn2)))
IF LEN(he)=2 &&有进位
jw=.t.
he=RIGHT(he,1)
ENDIF
RETURN he
ENDFUNC




FUNCTION cheng
*******************************
**单位数乘
*******************************
lPARAMETERS cn1,cn2
 LOCAL ji
 ji=ALLTRIM(STR(val(cn1)*val(cn2)))
 IF LEN(ji)=2 then&&有进位
 jw=.t.
 jws=LEFT(ji,1)
 endif
 RETURN right(ji,1)
ENDFUNC


FUNCTION mjia
***********************************
**模拟加法
***********************************
LPARAMETERS js1,js2 &&两个操作数
LOCAL he,p,i,j
jw=.f.
he="" &&存计算结果 和
jw=.f. &&进位标志
l1=LEN(js1)
l2=LEN(js2)
l=IIF(l1>=l2,l1,l2)
IF l1>l2 THEN  &&前面补0
js2=REPLICATE("0",l1-l2)+js2
ELSE
js1=REPLICATE("0",l2-l1)+js1
ENDIF
l1=l
p=1
FOR i= 1 TO l
w1=RIGHT(js1,1)
w2=RIGHT(js2,1)
IF jw then &&处理进位
 IF w1="9" then
 w1="0"
 jw=.t.
 ELSE
  w1=jia(w1,"1")
  jw=.f.
 ENDIF
ENDIF

he=he+jia(w1,w2)

js1=LEFT(js1,l1-1)
js2=LEFT(js2,l1-1)
l1=l1-1

NEXT i
IF jw then
he=he+"1"
jw=.f.
endif

l=LEN(he)
kk=""
FOR i=l TO 1 STEP -1
kk=kk+SUBSTR(he,i,1)
NEXT i

RETURN kk
ENDFUNC


FUNCTION jian
*******************************
**单位数减
*******************************
lPARAMETERS cn1,cn2

s1=val(cn1)
s2=val(cn2)
IF s1<s2 then
s1=10+s1
jw=.t.

ENDIF
RETURN  ALLTRIM(STR( s1-s2 ))
ENDFUNC

FUNCTION mjian
***********************************
**模拟减法
***********************************
LPARAMETERS js1,js2 &&两个操作数

LOCAL cha,l,p,i,jwhs1,i,j,lss1,ss,s
cha="" &&存计算结果 和
jw=.f. &&进位标志
l1=LEN(js1)
l2=LEN(js2)
IF l2>l1 then
 s=js1
 js1=js2
 js2=s
 p=.t.
 ELSE
 IF l2=l1 then
  IF js2>js1 then
   s=js1
   js1=js2
   js2=s
   p=.t.
   ENDIF
  ENDIF
 ENDIF
 l1=LEN(js1)
l2=LEN(js2)
js2=REPLICATE("0",l1-l2)+js2&&补齐位数
i=l1
DO WHILE i>=1
w1=SUBSTR(js1,i,1)
w2=SUBSTR(js2,i,1)
IF jw then &&处理借位
 IF w1="0" THEN &&如果本位不够,继续向前借位
   w1="9"
   jw=.t.
 ELSE
  w1=jian(w1,"1") &&已处理,清借位标志
  jw=.f.
 ENDIF
   
ENDIF
cha=cha+jian(w1,w2)
i=i-1
ENDDO


l=LEN(cha)
kk=""
FOR i=l TO 1 STEP -1
kk=kk+SUBSTR(cha,i,1)
NEXT i
m=0
FOR i=1 TO l
c=SUBSTR(kk,i,1)
IF c="0" then
m=m+1
ELSE
EXIT for
ENDIF
NEXT i
cha=SUBSTR(kk,m+1)
IF p then
cha="-"+cha
ENDIF

RETURN cha
ENDFUNC

FUNCTION mcheng
***********************************
**模拟乘法
***********************************
LPARAMETERS cs1,cs2
LOCAL l1,l2,ji,ls,csw1,csw2,ws,i,j,zji,ws2
jw=.f.
jws=""
ws2=1
ws=1
ls=""
ji="0"
zji="0"
l1=LEN(cs1)
l2=LEN(cs2)
FOR i= l2 TO 1 STEP -1
 csw2=SUBSTR(cs2,i,1)
 FOR j=l1 TO 1 STEP -1
  csw1=substr(cs1,j,1)
  *?csw1+"*"+csw2+"="
  ls=cheng(csw1,csw2)
  IF jw then
  ls=jws+ls
  jws="0"
  endif
  ji=mjia(ji,ls+REPLICATE("0",ws-1))
  ws=ws+1
 * ?ji
 NEXT j
 zji=mjia(zji,ji+REPLICATE("0",ws2-1))
 ji="0"
 ws2=ws2+1
 ws=1
 
NEXT i
RETURN zji
ENDfunc

******************
14:49修改了加法进位中出现两个9时计算错误的问题


[此贴子已经被作者于2017-3-30 16:50编辑过]

2017-03-30 13:59
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
收藏
得分:0 
回复 4楼 wp231957
应用是不多,我是看到前面求精确小数的问题想到的,解决这个就能解决哪个问题

[此贴子已经被作者于2017-3-30 15:34编辑过]

2017-03-30 15:29
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
收藏
得分:0 
回复 11楼 吹水佬
我用乘减方式完成,在个别应用中还行,效率因为字符串运算的关系肯定不会很高
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2017-4-5 08:45编辑过]

2017-04-05 08:44
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
收藏
得分:0 
回复 14楼 吹水佬
学习了,用数组方式比我直接用字符速度快
2017-04-06 08:18
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
收藏
得分:0 
回复 17楼 mywisdom88
用了迭代,整除的情况就没办法了。
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-04-06 09:17
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
收藏
得分:0 
回复 22楼 红星二锅头
运行了下,出现这样的结果:
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-04-06 14:32
快速回复:请教各位大师,怎么解决超大数的除法?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013132 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved