亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
不支持 bignum 的語言, 不依賴外部模塊, 如何實現(xiàn) [ + - * ] 運算
[打印本頁]
作者:
substr函數(shù)
時間:
2015-12-30 11:04
標題:
不支持 bignum 的語言, 不依賴外部模塊, 如何實現(xiàn) [ + - * ] 運算
py 支持
bignum
運算, 醬子
A = 123456789987654321
B = 999999888877777619
C = 234324411000000001
D = 342561233000011001
E = A * B + C - D
print D # 342561233000011001
復(fù)制代碼
問題: 不支持
bignum
的語言,
不
依賴外部模塊,
如何實現(xiàn) [
+ - *
] 運算
python 或 perl 或 awk 或 ....代碼
謝謝大神
作者:
jason680
時間:
2015-12-30 13:14
本帖最后由 jason680 于 2015-12-30 13:17 編輯
回復(fù)
1#
substr函數(shù)
想解決問題...
1. bc
$ echo 123456789987654321*999999888877777619+234324411000000001-342561233000011001 |
bc
123456776268861449439225475282430699
2. perl
$ echo 123456789987654321 999999888877777619 234324411000000001 342561233000011001 | perl -M
bigint
-lane '{$F[0]+=0;print ($F[0]*$F[1]+$F[2]-$F[3])}'
123456776268861449439225475282430699
3. awk
4.0
with
--bignum
4. by
yourself
作者:
substr函數(shù)
時間:
2015-12-30 13:21
回復(fù)
2#
jason680
J 神
不依賴外部模塊, 如何實現(xiàn)[
]
作者:
jason680
時間:
2015-12-30 13:27
回復(fù)
3#
substr函數(shù)
1.這是shell版
如果不能用bc,那用sed,awk,...的都不應(yīng)該用
注:也不用編程了,反正都不能用...
2.說說你真正的問題? 這個問題才有意義...
作者:
substr函數(shù)
時間:
2015-12-30 14:12
本帖最后由 substr函數(shù) 于 2015-12-30 17:50 編輯
回復(fù)
4#
jason680
謝謝 J 神
以語言描述是為了說明實現(xiàn)的過程
醬子, py 支持 bignum
A = 12345
B = 34567890123
print A + B
復(fù)制代碼
py 支持 bignum, [可以假定 py 不支持],
比如
py 可以如此 實現(xiàn) +
#!/usr/bin/python2
# coding: utf-8
A = '12345'
B = '34567890123678889999999923455555'
def ADD(a, b):
L = len(a) - len(b)
if L > 0:
b = '0' * L + b
else:
a = '0' * -L + a
N = 0
A = [0] * len(a)
for i in xrange(len(a) - 1, -1, -1):
V = int(a[i]) + int(b[i]) + N
N = V / 10
A[i] = str(V % 10)
S = ''.join(str(E) for E in A)
if N > 0: S = str(N) + S
return S
print ADD(B, A)
復(fù)制代碼
減法同理
J 神, 應(yīng)該如何實現(xiàn) [ * ] 運算
作者:
jason680
時間:
2015-12-30 14:33
回復(fù)
5#
substr函數(shù)
以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 數(shù)組最大空間(長度)為length(A)+length(B) = 5
自行實現(xiàn)...
xxx34
xx
5
7
6
=====
xxx24 (4*
6
)
xx18 (3*
6
)
xx28 (4*
7
)
x21 (3*
7
)
x20 (4*
5
)
15 (3*
5
)
====
19584
作者:
ly5066113
時間:
2015-12-30 15:09
回復(fù)
1#
substr函數(shù)
sed版dc計算器,滿足你的需求:
http://72891.cn/thread-1844319-1-1.html
作者:
jason680
時間:
2015-12-30 15:23
本帖最后由 jason680 于 2015-12-30 15:51 編輯
回復(fù)
5#
substr函數(shù)
awk for multiply with bignum
$ echo 12345678901234567890 12345678901234567890 | awk '{print $1*$2}'
1524157875323883
44689912330787336749056
$ echo 12345678901234567890 12345678901234567890 | awk -f bigint.awk
1524157875323883
67501905199875019052100
$ echo 12345678901234567890*12345678901234567890 | bc
1524157875323883
67501905199875019052100
$ 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)
}
作者:
substr函數(shù)
時間:
2015-12-30 16:26
回復(fù)
7#
ly5066113
謝謝 L 神
贊一個!
可惜了. ... sed 的算法不通用呀 [
]
作者:
substr函數(shù)
時間:
2015-12-30 16:32
回復(fù)
8#
jason680
謝謝 J 神
贊一個! [
]
這個 * 我想了 10 幾天,
想不到J 神, 竟如此輕易給實現(xiàn)了
醬子, 翻譯了下 py...贊一個!
#!/usr/bin/python2
# coding: utf-8
def MUL(a, b):
A = [int(E) for E in a[::-1]]
B = [int(E) for E in b[::-1]]
C = [0] * (len(a) + len(b))
for i, P in enumerate(A):
for j, Q in enumerate(B):
C[i + j] += P * Q
n = 0
for i, v in enumerate(C):
C[i] = (n + v) % 10
n = (n + v) / 10
while C[-1] is 0: C.pop()
return ''.join(str(E) for E in C)[::-1]
A = '99009'
B = '990199999999999999976233444444444442210506'
print MUL(A, B)
print int(A) * int(B)
# 9911112211111111111111011999877888888888888888888890
# 9911112211111111111111011999877888888888888888888890
復(fù)制代碼
有了 [ + - * ] 在一個 [ / ] 就圓滿了
J 神, 如何實現(xiàn) [ / ] 運算 [
]
作者:
chengchow
時間:
2015-12-30 16:33
shell可以做基本的運算,不支持浮點運算
你這個可以醬紫
let E=A*B+C-D
作者:
substr函數(shù)
時間:
2015-12-30 16:43
回復(fù)
11#
chengchow
感謝 C 神, 指導(dǎo),
想知道的是如何實現(xiàn) [
]
作者:
chengchow
時間:
2015-12-30 16:53
ossim121:/tmp# cat aa.sh
#!/bin/bash
a=$1
b=$2
c=$3
d=$4
let e="$c*($d+$b)-$a"
echo $e
exit 0
ossim121:/tmp# sh aa.sh 1 2 3 4
17
作者:
substr函數(shù)
時間:
2015-12-30 16:59
回復(fù)
13#
chengchow
感謝 C 神, 指導(dǎo),
想知道的是 [
]
不支持 bignum 的語言, 不依賴外部模塊
可以如何實現(xiàn) [
]
作者:
chengchow
時間:
2015-12-30 17:09
ossim121:/tmp# cat aa.sh
#!/bin/bash
a=$1
b=$2
c=$3
d=$4
e=`echo 1 | awk -va=$1 -vb=$2 -vc=$3 -vd=$4 '{printf a*b+c-d}'`
echo $e
exit 0
ossim121:/tmp# sh aa.sh 1 2 3 4
1
作者:
substr函數(shù)
時間:
2015-12-30 17:15
回復(fù)
15#
chengchow
感謝 C 神, 再度指導(dǎo),
bash 已有支持
我是小白
小白想知道的是
不支持 bignum 的語言, 不依賴外部模塊
可以如何實現(xiàn)
bash 已有支持, 不算呀! [
]
作者:
seanking1987
時間:
2015-12-30 17:17
LZ好學,令人佩服。
看了J神的算法,還是沒太明白。。。
想了下還是算了,用現(xiàn)有工具好了
作者:
chengchow
時間:
2015-12-30 17:27
回復(fù)
16#
substr函數(shù)
后面的不是用awk給你做運算的嗎
作者:
substr函數(shù)
時間:
2015-12-30 17:37
本帖最后由 substr函數(shù) 于 2015-12-30 17:55 編輯
回復(fù)
18#
chengchow
感謝 C 神, 再度指導(dǎo),
8 樓 那個 awk 沒有使用到 bignum 的支持呀
[而卻支持了bignum]
那才是是我要的實現(xiàn) [
]
謝謝 C 神
作者:
jason680
時間:
2015-12-30 20:22
本帖最后由 jason680 于 2015-12-30 20:58 編輯
回復(fù)
10#
substr函數(shù)
>> ...如何實現(xiàn) [ / ] 運算
http://www.algorithmist.com/index.php/BigNum
還要除法[ / ],那一起把正負號也加入...
(要找時間來實現(xiàn)....)
先定規(guī)格
xxx
_u unsigned
xxx
_s signed
xxx
_f float
xxx
xxx
for function name:
add加, sub減, mul乘, div除,
lt小于, gt大于, eq等于,ne不等于, le小于等于, ge大于等于,
max最大, min最小, abs絕對, ....
作者:
MMMIX
時間:
2015-12-30 20:32
回復(fù)
1#
substr函數(shù)
你直接把 Python 的 bignum 實現(xiàn)找出來看看,再用其他語言實現(xiàn)就是了。
作者:
substr函數(shù)
時間:
2016-01-02 11:37
回復(fù)
21#
MMMIX
Master: It is C: <all>
I am a small white..
[
]
作者:
substr函數(shù)
時間:
2016-01-02 11:38
回復(fù)
21#
MMMIX
我是小白
small white
作者:
jason680
時間:
2016-01-03 15:01
回復(fù)
10#
substr函數(shù)
除法
ex: 378 / 23
1. 初始
bn1 = 378
bn2 = 23
len1 = length("378") = 3
len2 = length("23") = 2
len1 要大于等于 len2
由
37
8
取出與
23
相同長度(
2
)
bn1 = 378, dvn =
37
, bn2 = 23
2. 用(相比)減法做除法
37
>=
23
True
, ==> 37
-
23
=
15
, 數(shù)組++ =
1
15
>=23
False
,
換一下位
15
8
158 >=
23
True
, ==> 158 - 23 = 135
, 數(shù)組++ = 1
1
135 >=
23
True
, ==> 135 - 23 = 112
, 數(shù)組++ = 1
2
...
33 >=
23
True
, ==> 33 - 23 =
10
, 數(shù)組++ = 1
6
10
>=
23
False
3. 16
4. awk code (div function with unsigned only)
xxx_
bn
for
b
ig
n
umber
xxx_
bs
for
b
ig number with
s
igned
xxx_
bu
for
b
ig number with
u
nsigned
function _div_bu(bu1, bu2, len1,len2,len,n,c1,c2,dvn){
len1 = length(bu1)
len2 = length(bu2)
if(len1 < len2 || (len1 == len2) && (bu1"" < bu2"")) return "0"
len = len1 - len2 + 1
delete _x
dvn = substr(bu1, 1, len2)
for(n=1; n<=len; n++){
_x[n] = 0
while(
_GE
(dvn, bu2)){
_x[n]++
dvn =
_sub_bu
(dvn, bu2)
}
dvn = dvn get1(bu1, n+len2)
}
return _get_ret(len,"x")
}
function _get_ret(len, x, n,ret){
for(n=1; n<=len; n++){
if(x == ""){
ret = _a[n]%10 ret
_a[n+1] += int(_a[n]/10)
}
else{
ret = ret _x[n]
}
}
sub(/^0+/, "", ret)
if(ret == "") ret = "0"
return ret
}
5. 測試驅(qū)動開發(fā) TDD
https://zh.wikipedia.org/zh-cn/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91
$ awk -vTEST=1 -v TEST_LVL=2 -f bignum.awk
test 1
PASSED!!!
normal: 2 > -3 = True
bignum: 2 > -3 = True (by _GT function)
test 2
PASSED!!!
normal: 2 >= -3 = True
bignum: 2 >= -3 = True (by _GE function)
test 3
PASSED!!!
normal: 2 < -3 = False
bignum: 2 < -3 = False (by _LT function)
test 4
PASSED!!!
normal: 2 <= -3 = False
bignum: 2 <= -3 = False (by _LE function)
test 5
PASSED!!!
normal: 2 == -3 = False
bignum: 2 == -3 = False (by _EQ function)
test 6
PASSED!!!
normal: 2 != -3 = True
bignum: 2 != -3 = True (by _NE function)
test 7
PASSED!!!
normal: 2 + -3 = -1
bignum: 2 + -3 = -1 (by add_bn function)
test 8
PASSED!!!
normal: 2 - -3 = 5
bignum: 2 - -3 = 5 (by sub_bn function)
...
test 134
PASSED!!!
normal: -1234567890 / -233 = 5298574
bignum: -1234567890 / -233 = 5298574 (by div_bn function)
test 135
PASSED!!!
normal: 1234567890 / 233 = 5298574
bignum: 1234567890 / 233 = 5298574 (by div_bn function)
test 136
PASSED!!!
normal: 1234567890*5537483*666699999999999999967777/12345671236789+667785412345-12345/233 = 369184220770065865283121625
bignum: 1234567890*5537483*666699999999999999967777/12345671236789+667785412345-12345/233 = 369184220770065865283121625 (by bignum function)
test 137
PASSED!!!
normal: -1234567890*5537483*-666699999999999999967777/-12345671236789+667785412345-12345/233 = -369184220770064529712297039
bignum: -1234567890*5537483*-666699999999999999967777/-12345671236789+667785412345-12345/233 = -369184220770064529712297039 (by bignum function)
test 138
PASSED!!!
normal: 1234567890*5537483*666699999999999999967777/1234567123 = 3691842209730830511335195117281
bignum: 1234567890*5537483*666699999999999999967777/1234567123 = 3691842209730830511335195117281 (by bignum function)
作者:
substr函數(shù)
時間:
2016-01-03 15:58
回復(fù)
20#
jason680
謝謝 J 神 [
]
期待 i .. n .. g ..
作者:
jason680
時間:
2016-01-03 16:58
回復(fù)
25#
substr函數(shù)
不知為什么24帖(我發(fā)的,不見了),再重發(fā)...
除法 ex: 378 / 23
1. 初始
bn1 = 378
bn2 = 23
len1 = length("378") = 3
len2 = length("23") = 2
len1須大于等于len2
由bn1取出與bn2相同長度(2)
bn1 =
37
8, dvn =
37
, bn2=23
2. big number 使用比較(
大于等于
)與 減法 代替 除法
37
>=
23
True
, 37 - 23 = 14, _x數(shù)組++ = 1
14
>=
23
False
, 取下一個數(shù) 378
148
>=
23
True
, 148 - 23 = 125, _x數(shù)組++ = 11
125
>=
23
True
, 125 - 23 = 102, _x數(shù)組++ = 12
105
>=
23
True
, 102 - 23 = 79, _x數(shù)組++ = 13
...
56
>=
23
True
, 56 - 23 = 33, _x數(shù)組++ = 15
33
>=
23
True
, 33 - 23 = 10, _x數(shù)組++ = 16
10
>=
23
False
,
answer = 16
3. awk code ( div with unsigned only)
# xxx_bn for bing number
# xxx_bs for bing number with signed
# xxx_bu for bing number with unsigned
function _div_bu(bu1, bu2, len1,len2,len,n,c1,c2,dvn){
len1 = length(bu1)
len2 = length(bu2)
if(len1 < len2 || (len1 == len2) && (bu1"" < bu2"")) return "0"
len = len1 - len2 + 1
delete _x
dvn = substr(bu1, 1, len2) #由bn1取出與bn2相同長度
for(n=1; n<=len; n++){
_x[n] = 0
while(
_GE
(dvn, bu2)){
_x[n]++
dvn = _sub_bu(dvn, bu2)
}
dvn = dvn get1(bu1, n+len2)
}
return _get_ret(len,"x")
}
4.
測試驅(qū)動開發(fā)
(TDD, Test-driven development)
https://zh.wikipedia.org/zh-cn/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91
測試驅(qū)動開發(fā)
(Test-driven development)是
極限編程
中倡導(dǎo)的程序開發(fā)方法,以其倡導(dǎo)先寫測試程序,然后編碼實現(xiàn)其功能得名。...
$ awk -vTEST=1 -v TEST_LVL=2 -f bignum.awk
test 1 PASSED!!!
normal: 2 > -3 = True
bignum: 2 > -3 = True (by _GT function)
test 2 PASSED!!!
normal: 2 >= -3 = True
bignum: 2 >= -3 = True (by _GE function)
test 3 PASSED!!!
normal: 2 < -3 = False
bignum: 2 < -3 = False (by _LT function)
test 4 PASSED!!!
normal: 2 <= -3 = False
bignum: 2 <= -3 = False (by _LE function)
test 5 PASSED!!!
normal: 2 == -3 = False
bignum: 2 == -3 = False (by _EQ function)
test 6 PASSED!!!
normal: 2 != -3 = True
bignum: 2 != -3 = True (by _NE function)
test 7 PASSED!!!
normal: 2 + -3 = -1
bignum: 2 + -3 = -1 (by add_bn function)
test 8 PASSED!!!
normal: 2 - -3 = 5
bignum: 2 - -3 = 5 (by sub_bn function)
...
test 134 PASSED!!!
normal: -1234567890 / -233 = 5298574
bignum: -1234567890 / -233 = 5298574 (by div_bn function)
test 135 PASSED!!!
normal: 1234567890 / 233 = 5298574
bignum: 1234567890 / 233 = 5298574 (by div_bn function)
test 136 PASSED!!!
normal: 1234567890*5537483*666699999999999999967777/12345671236789+667785412345-12345/233 = 369184220770065865283121625
bignum: 1234567890*5537483*666699999999999999967777/12345671236789+667785412345-12345/233 = 369184220770065865283121625 (by bignum function)
test 137 PASSED!!!
normal: -1234567890*5537483*-666699999999999999967777/-12345671236789+667785412345-12345/233 = -369184220770064529712297039
bignum: -1234567890*5537483*-666699999999999999967777/-12345671236789+667785412345-12345/233 = -369184220770064529712297039 (by bignum function)
test 138 PASSED!!!
normal: 1234567890*5537483*666699999999999999967777/1234567123 = 3691842209730830511335195117281
bignum: 1234567890*5537483*666699999999999999967777/1234567123 = 3691842209730830511335195117281 (by bignum function)
作者:
jason680
時間:
2016-01-03 17:08
本帖最后由 jason680 于 2016-01-03 17:31 編輯
回復(fù)
25#
substr函數(shù)
兩次回帖,都看不到......
先回后改...
big number 除法
ex: 378 / 23
1. 初始
bn1 = 378
bn2 = 23
len1 = length("378") = 3
len2 = length("23") = 2
len1 須大于等于 len2
由bn1取出與bn2相同長度
bn1=
37
8, dvn=
37
, bn2=23
2. 先
比
后
減
==>
除法
37
>=
23
True
, 37
-
23 =
14
, _x數(shù)組(第一位)加1 =
1
14
>=
23
False
, 取一下位
14
8
>=
23
True
, 148
-
23 = 125, _x數(shù)組(第二位)加1 = 1
1
125
>=
23
True
, 125
-
23 = 102, _x數(shù)組(第二位)加1 = 1
2
...
56
>=
23
True
, 56
-
23 = 33, _x數(shù)組(第二位)加1 = 1
5
33
>=
23
True
, 33
-
23 = 10, _x數(shù)組(第二位)加1 = 1
6
14
>=
23
False
Answer = 16
3. awk code ( div with unsigned only)
function _
div
_bu(bu1, bu2, len1,len2,len,n,dvn){
len1 = length(bu1)
len2 = length(bu2)
if(len1 < len2 || (len1 == len2) && (bu1"" < bu2"")) return "0"
len = len1 - len2 + 1
delete _x
dvn = substr(bu1, 1, len2)
for(n=1; n<=len; n++){
_x[n] = 0
while(
_GE
(dvn, bu2)){
_x[n]++
dvn =
_sub_bu
(dvn, bu2)
}
dvn =
dvn
get1(bu1, n+len2)
}
return _get_ret(len,"x")
}
作者:
substr函數(shù)
時間:
2016-01-03 17:11
回復(fù)
27#
jason680
謝謝 J 神
期待 i .. n .. g .. [
]
作者:
jason680
時間:
2016-01-03 21:34
回復(fù)
28#
substr函數(shù)
測試驅(qū)動開發(fā)(TDD,Test-driven development)
測試驅(qū)動開發(fā)(Test-driven development)是極限編程中倡導(dǎo)的程序開發(fā)方法,以其倡導(dǎo)先寫測試程序,然后編碼實現(xiàn)其功能得名。...
$ awk -vTEST=1 -v TEST_LVL=2 -f bignum.awk
test 1 PASSED!!!
normal: 2 > -3 = True
bignum: 2 > -3 = True (by _GT function)
test 2 PASSED!!!
normal: 2 >= -3 = True
bignum: 2 >= -3 = True (by _GE function)
test 3 PASSED!!!
normal: 2 < -3 = False
bignum: 2 < -3 = False (by _LT function)
test 4 PASSED!!!
normal: 2 <= -3 = False
bignum: 2 <= -3 = False (by _LE function)
test 5 PASSED!!!
normal: 2 == -3 = False
bignum: 2 == -3 = False (by _EQ function)
test 6 PASSED!!!
normal: 2 != -3 = True
bignum: 2 != -3 = True (by _NE function)
test 7 PASSED!!!
normal: 2 + -3 = -1
bignum: 2 + -3 = -1 (by add_bn function)
test 8 PASSED!!!
normal: 2 - -3 = 5
bignum: 2 - -3 = 5 (by sub_bn function)
...
test 134 PASSED!!!
normal: -1234567890 / -233 = 5298574
bignum: -1234567890 / -233 = 5298574 (by div_bn function)
test 135 PASSED!!!
normal: 1234567890 / 233 = 5298574
bignum: 1234567890 / 233 = 5298574 (by div_bn function)
test 136 PASSED!!!
normal: 1234567890*5537483*666699999999999999967777/12345671236789+667785412345-12345/233 = 369184220770065865283121625
bignum: 1234567890*5537483*666699999999999999967777/12345671236789+667785412345-12345/233 = 369184220770065865283121625 (by bignum function)
test 137 PASSED!!!
normal: -1234567890*5537483*-666699999999999999967777/-12345671236789+667785412345-12345/233 = -369184220770064529712297039
bignum: -1234567890*5537483*-666699999999999999967777/-12345671236789+667785412345-12345/233 = -369184220770064529712297039 (by bignum function)
test 138 PASSED!!!
normal: 1234567890*5537483*666699999999999999967777/1234567123 = 3691842209730830511335195117281
bignum: 1234567890*5537483*666699999999999999967777/1234567123 = 3691842209730830511335195117281 (by bignum function)
作者:
陳卓文
時間:
2016-01-04 14:47
J神~
在get_num函數(shù)中
if(abs(pos) > len || pos == 0)
return(0)
這兩行有什么作用呢?去掉它不會影響任何東西
感謝~
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)
}
回復(fù)
8#
jason680
作者:
jason680
時間:
2016-01-05 08:29
回復(fù)
30#
陳卓文
當pos大于num長度或小于1...
substr(num,
pos
, 1)
作者:
陳卓文
時間:
2016-01-05 12:54
明白~
謝謝J神
回復(fù)
31#
jason680
作者:
substr函數(shù)
時間:
2016-01-13 18:57
謝謝 J 神!!
終于看到啦 [
]
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2