|
|
[原创]如何对阶乘求逆?
|
思路仍是上面的,办法有了.
比如一个阶乘数m=720,其二进制形式末尾有4个(记为q=4)连续"0",:
1011010000
q即4也表示成二进制形式:
100,其位数3用s表示,则n在2^s附近,暂时认为2^s=8>=n>2^(s-1)=4
先取n=8...
--------
下面用Purebasic进行,没有考虑异常,比如你输入的m不是阶乘数或输入错误.
试验参考数据:
n q s m == 二进制
1 0==0 0 1==1
2 1==1 1 2==10
3 1==1 1 6==110
4 3==11 2 24==11000
5 3==11 2 120==1111000
6 4==100 3 720==1011010000
7 4==100 3 5040==1001110110000
8 7==111 3 40320==1001110110000000
9 7==111 3 362880==1011000100110000000
10 8==1000 4 3628800==1101110101111100000000
17 15==1111 4 355687428096000==1010000110111111011101110110011011000000000000000
16 15==1111 4 355687428096000/17==100110000011101110111011101011000000000000000
下面是程序,把上面m,q和s代人下面开始处后,运行.[注意]m.q中".q"是数据类型,别搞混了.
程序基本是我前面的,有变通,解释比较麻烦,略去.看我后面结果,无论大小数,除法都不超过4次.
m.q=355687428096000:q=15:s=4
Procedure.q i(v):v1.q=1
For k=2 To v
v1=v1*k
Next
ProcedureReturn v1
EndProcedure
n=Pow(2,s):n+2:BB:b=0:w=n:j=0:nn=0
AA:If w>1:w/2:b+w:j+1:Goto AA:EndIf
If b>q:If nn=2:n-1:Goto CC:Else:nn=1:n-2:Goto BB:EndIf
ElseIf bm:n-1:ElseIf ii-=-=-=-=- 以下内容由 ataorj 在 时添加 -=-=-=-=-
"思路基本是我前面的",错成"程序基本是我前面的" |
|