| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2643 人关注过本帖, 1 人收藏
标题:请教各位大师,怎么解决超大数的除法?
只看楼主 加入收藏
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:5
帖 子:58
专家分:134
注 册:2014-6-26
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:24 
请教各位大师,怎么解决超大数的除法?
对于有几十个数字的超大数,比如9854422144556622455625/56254455224444554之类的,怎么用字串形式,模拟手动做除法啊?
2017-03-30 11:11
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3146
专家分:8408
注 册:2015-3-25
收藏
得分:4 
不知道,16进制数,能不能除的,如果可以,转为16进制,应该能解决。。
WIN7 64 能算出来。
175175.85238785721761703231817399

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

2017-03-30 12:33
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:4 
超大数除法没啥研究必要吧

DO IT YOURSELF !
2017-03-30 14:31
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3146
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用zyxxzhyg在2017-3-30 13:59:23的发言:
ENDFUNC


不对,你楼主的2个数字,做乘法。
WIN 7电脑算的是 5.5435514929373539604468071417414e+38
你的是 056222.....................................

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

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

2017-03-30 15:29
红星二锅头
Rank: 8Rank: 8
等 级:贵宾
威 望:46
帖 子:491
专家分:754
注 册:2016-8-25
收藏
得分:4 
To 3F 的 zyxxzhyg
大数的运算首先考虑的是精度
其次是速度
我们做个极限测试
如果不考虑小数位
假设是 1000000 位的 4 + 1000000 位的 7
正确的应该是 122222222.....1,长度是 10000001
用你的代码半小时也没有出来
像这样 1000000 位的四则运算,应该秒杀

用你的代码试试看:
Clear
*!*    Accept'请输入加数:'To x
*!*    Accept'请输入被加数:'To Y
x = Replicate("4", 1000000)
Y = Replicate("7", 1000000)
m.sc = Seconds()
z = mjia(x,Y)
? "耗时:" + Transform(Seconds() - m.sc) +  "秒"
? Len(z)       && 显示计算的位数
? Left(z, 20)  && 显示前20位的数据


团队红星二锅头,队长王猛,领队李冲,顾问杨伟,副队张挺,外联马彪,内勤韩秀,人事顾闯,财务赵魁,后勤周强
2017-03-30 15:42
红星二锅头
Rank: 8Rank: 8
等 级:贵宾
威 望:46
帖 子:491
专家分:754
注 册:2016-8-25
收藏
得分:0 
尽量用堆栈、复制内存、分配内存等 API 函数做

如果要考虑小数位等精度的四则运算
比如:加、减、乘、除、平方、开根、指数、幂、Pi、三角函数等等
还是用 DLL 吧。

团队红星二锅头,队长王猛,领队李冲,顾问杨伟,副队张挺,外联马彪,内勤韩秀,人事顾闯,财务赵魁,后勤周强
2017-03-30 15:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10559
专家分:42996
注 册:2014-5-20
收藏
得分:4 
1、用减法
2、模拟除法算术式。
2017-03-30 17:15
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
应用不多
2017-03-31 07:14
快速回复:请教各位大师,怎么解决超大数的除法?
数据加载中...
 
   



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

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