免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 4423 | 回复: 32

[数值计算] 不支持 bignum 的语言, 不依赖外部模块, 如何实现 [ + - * ] 运算 [复制链接]

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-12-30 11:04 |显示全部楼层

py 支持  bignum 运算, 酱子

  1. A = 123456789987654321
  2. B = 999999888877777619
  3. C = 234324411000000001
  4. D = 342561233000011001
  5. E = A * B + C - D

  6. print D # 342561233000011001
复制代码
问题: 不支持 bignum 的语言, 依赖外部模块,
如何实现 [ + - * ] 运算

python 或 perl 或 awk 或 ....代码
谢谢大神

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-12-30 13:14 |显示全部楼层
本帖最后由 jason680 于 2015-12-30 13:17 编辑

回复 1# substr函数

想解决问题...

1. bc
$ echo 123456789987654321*999999888877777619+234324411000000001-342561233000011001 | bc
123456776268861449439225475282430699

2. perl   
$ echo 123456789987654321 999999888877777619 234324411000000001 342561233000011001 | perl -Mbigint -lane '{$F[0]+=0;print ($F[0]*$F[1]+$F[2]-$F[3])}'
123456776268861449439225475282430699

3. awk 4.0 with --bignum


4. by yourself

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-12-30 13:21 |显示全部楼层
回复 2# jason680

J 神
不依赖外部模块, 如何实现[ ]
   

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-12-30 13:27 |显示全部楼层
回复 3# substr函数

1.这是shell版
如果不能用bc,那用sed,awk,...的都不应该用
注:也不用编程了,反正都不能用...

2.说说你真正的问题? 这个问题才有意义...
   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-12-30 14:12 |显示全部楼层
本帖最后由 substr函数 于 2015-12-30 17:50 编辑

回复 4# jason680


   
谢谢 J 神
以语言描述是为了说明实现的过程

酱子, py 支持 bignum

  1. A = 12345
  2. B = 34567890123

  3. print A + B

复制代码
py 支持 bignum, [可以假定 py 不支持],
比如

py 可以如此 实现 +

  1. #!/usr/bin/python2
  2. # coding: utf-8

  3. A = '12345'
  4. B = '34567890123678889999999923455555'


  5. def ADD(a, b):
  6.     L = len(a) - len(b)
  7.     if L > 0:
  8.         b = '0' * L + b
  9.     else:
  10.         a = '0' * -L + a

  11.     N = 0
  12.     A = [0] * len(a)
  13.     for i in xrange(len(a) - 1, -1, -1):
  14.         V = int(a[i]) + int(b[i]) + N
  15.         N = V / 10
  16.         A[i] = str(V % 10)
  17.    
  18.     S = ''.join(str(E) for E in A)
  19.     if N > 0: S = str(N) + S
  20.     return S


  21. print ADD(B, A)


复制代码
减法同理


J 神, 应该如何实现 [ * ] 运算

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-12-30 14:33 |显示全部楼层
回复 5# substr函数

以A =34,B =576为例
length(A)=2, length(B)=3
A=34 < 10^2,  B=576 < 10^3
A * B < 10^2 * 10^3 = 10^5
A * B 数组最大空间(长度)为length(A)+length(B) = 5

自行实现...

xxx34
xx576
=====
xxx24  (4*6)
xx18   (3*6)

xx28   (4*7)
x21    (3*7)

x20    (4*5)
15     (3*5)
====
19584


论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
发表于 2015-12-30 15:09 |显示全部楼层
回复 1# substr函数


sed版dc计算器,满足你的需求:
http://bbs.chinaunix.net/thread-1844319-1-1.html

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-12-30 15:23 |显示全部楼层
本帖最后由 jason680 于 2015-12-30 15:51 编辑

回复 5# substr函数

awk for multiply with bignum

$ echo 12345678901234567890 12345678901234567890 | awk '{print $1*$2}'
152415787532388344689912330787336749056

$ echo 12345678901234567890 12345678901234567890 | awk -f bigint.awk
152415787532388367501905199875019052100

$ echo 12345678901234567890*12345678901234567890 | bc
152415787532388367501905199875019052100

$ cat bigint.awk
function abs(n){
    return n>=0 ? n : -n
}
function get_num(num, pos){
    len = length(num)
    if(abs(pos) > len || pos == 0)
        return(0)
    pos = (pos>0) ? pos : len+pos+1
    return substr(num, pos, 1)
}

function mul(n1, n2, len1,len2,len,n,ret){
    len1 = length(n1)
    len2 = length(n2)
    len  = len1 + len2
    delete a
    for(c1=1; c1<=len1; c1++){
        for(c2=1; c2<=len2; c2++)  
            a[c1+c2-1] += get_num(n1,-c1) * get_num(n2,-c2);
    }
    for(n=1; n<=len; n++){
       ret = a[n]%10 ret
       a[n+1] += int(a[n]/10)
    }
    sub(/^0+/, "", ret)
    return ret
}
{
  print mul($1, $2)
}

   

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 赞一个! 想不到J 神, 竟如此轻易给实现了

查看全部评分

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-12-30 16:26 |显示全部楼层
回复 7# ly5066113


谢谢 L 神
赞一个!
可惜了. ... sed 的算法不通用呀 [ ]

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-12-30 16:32 |显示全部楼层
回复 8# jason680


谢谢 J 神
赞一个! [   ]
这个 * 我想了 10 几天,
想不到J 神, 竟如此轻易给实现了

酱子, 翻译了下 py...赞一个!

  1. #!/usr/bin/python2
  2. # coding: utf-8

  3. def MUL(a, b):
  4.     A = [int(E) for E in a[::-1]]
  5.     B = [int(E) for E in b[::-1]]
  6.     C = [0] * (len(a) + len(b))
  7.     for i, P in enumerate(A):
  8.         for j, Q in enumerate(B):
  9.             C[i + j] += P * Q
  10.     n = 0
  11.     for i, v in enumerate(C):
  12.         C[i] = (n + v) % 10
  13.         n = (n + v) / 10
  14.    
  15.     while C[-1] is 0: C.pop()
  16.     return ''.join(str(E) for E in C)[::-1]


  17. A = '99009'
  18. B = '990199999999999999976233444444444442210506'

  19. print MUL(A, B)
  20. print int(A) * int(B)

  21. # 9911112211111111111111011999877888888888888888888890
  22. # 9911112211111111111111011999877888888888888888888890

复制代码
有了 [ + - * ] 在一个 [ / ] 就圆满了


J 神, 如何实现 [ / ] 运算 [   ]

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP