【题目】:假设ABCD是N进制下的数,假如ABCD*k=DCBA (设k是d进制下的非零个位数),请求出4-16进制下符合题意的所有解。
【分析】:如果这个题只求10进制下的解,那么就是一个小学奥数题,可以用各种拼凑法算出最后的答案,当然高手也可以用数论知识,用欧拉或费马定理去求解。but,我们有编程这个强大武器,这种问题用程序来处理完全是小case.
首先理解一下进制。常用的10进值就是逢10进1,一个10进制的ABCD,相当于:
A * 10^3 + B * 10^2 + C*10 + D
而如果是16进制,就是逢16进1,一个16进制的ABCD,相当于:
A * 16^3 + B * 16^2 + C*16 + D
程序如下:
local function findNextNum(n,start,...)
local num=start-1
local aa,bb,cc=...
repeat
num=num+1
if num==n then break end
until num~=aa and num~=bb and num~=cc
return num
end
local function solving()
local a,b,c,d,k
local n=4
while n<17 do
a=0
while a<n do
b=0
while b<n do
b=findNextNum(n,b,a)
if b==n then break end
c=0
while c<n do
c=findNextNum(n,c,a,b)
if c==n then break end
d=0
while d<n do
d=findNextNum(n,d,a,b,c)
if d==n then break end
local p = a*n*n*n + b*n*n + c*n + d
local q = d*n*n*n + c*n*n + b*n + a
if math.mod(q,p)==0 and q/p<n then
print("N="..n)
print("A="..a,"B="..b,"C="..c,"D="..d)
print("K="..q/p)
print("------------------------------")
end
d=d+1
end
c=c+1
end
b=b+1
end
a=a+1
end
n=n+1
end
print ("End of solving")
end
solving()
---------------------------------------
结果:
N=4
A=1B=0C=2D=3
K=3
------------------------------
N=5
A=1B=0C=3D=4
K=4
------------------------------
N=6
A=1B=0C=4D=5
K=5
------------------------------
N=6
A=2B=1C=3D=4
K=2
------------------------------
N=7
A=1B=0C=5D=6
K=6
------------------------------
N=8
A=0B=5C=7D=2
K=4
------------------------------
N=8
A=1B=0C=6D=7
K=7
------------------------------
N=8
A=2B=1C=5D=6
K=3
------------------------------
N=9
A=0B=5C=8D=3
K=6
------------------------------
N=9
A=1B=0C=7D=8
K=8
------------------------------
N=9
A=3B=2C=5D=6
K=2
------------------------------
N=10
A=1B=0C=8D=9
K=9
------------------------------
N=10
A=2B=1C=7D=8
K=4
------------------------------
N=11
A=1B=0C=9D=10
K=10
------------------------------
N=11
A=1B=2C=9D=8
K=7
------------------------------
N=11
A=1B=6C=9D=4
K=3
------------------------------
N=11
A=2B=9C=6D=8
K=3
------------------------------
N=12
A=1B=0C=10D=11
K=11
------------------------------
N=12
A=2B=1C=9D=10
K=5
------------------------------
N=12
A=3B=2C=8D=9
K=3
------------------------------
N=12
A=4B=3C=7D=8
K=2
------------------------------
N=13
A=1B=0C=11D=12
K=12
------------------------------
N=14
A=0B=9C=13D=4
K=7
------------------------------
N=14
A=1B=0C=12D=13
K=13
------------------------------
N=14
A=2B=1C=11D=12
K=6
------------------------------
N=15
A=0B=9C=14D=5
K=9
------------------------------
N=15
A=0B=11C=14D=3
K=5
------------------------------
N=15
A=1B=0C=2D=11
K=11
------------------------------
N=15
A=1B=0C=13D=14
K=14
------------------------------
N=15
A=3B=2C=11D=12
K=4
------------------------------
N=15
A=5B=4C=9D=10
K=2
------------------------------
N=16
A=0B=13C=4D=8
K=10
------------------------------
N=16
A=1B=0C=14D=15
K=15
------------------------------
N=16
A=2B=1C=13D=14
K=7
------------------------------
N=16
A=4B=3C=11D=12
K=3
------------------------------
End of solving
【分析】:如果这个题只求10进制下的解,那么就是一个小学奥数题,可以用各种拼凑法算出最后的答案,当然高手也可以用数论知识,用欧拉或费马定理去求解。but,我们有编程这个强大武器,这种问题用程序来处理完全是小case.
首先理解一下进制。常用的10进值就是逢10进1,一个10进制的ABCD,相当于:
A * 10^3 + B * 10^2 + C*10 + D
而如果是16进制,就是逢16进1,一个16进制的ABCD,相当于:
A * 16^3 + B * 16^2 + C*16 + D
程序如下:
local function findNextNum(n,start,...)
local num=start-1
local aa,bb,cc=...
repeat
num=num+1
if num==n then break end
until num~=aa and num~=bb and num~=cc
return num
end
local function solving()
local a,b,c,d,k
local n=4
while n<17 do
a=0
while a<n do
b=0
while b<n do
b=findNextNum(n,b,a)
if b==n then break end
c=0
while c<n do
c=findNextNum(n,c,a,b)
if c==n then break end
d=0
while d<n do
d=findNextNum(n,d,a,b,c)
if d==n then break end
local p = a*n*n*n + b*n*n + c*n + d
local q = d*n*n*n + c*n*n + b*n + a
if math.mod(q,p)==0 and q/p<n then
print("N="..n)
print("A="..a,"B="..b,"C="..c,"D="..d)
print("K="..q/p)
print("------------------------------")
end
d=d+1
end
c=c+1
end
b=b+1
end
a=a+1
end
n=n+1
end
print ("End of solving")
end
solving()
---------------------------------------
结果:
N=4
A=1B=0C=2D=3
K=3
------------------------------
N=5
A=1B=0C=3D=4
K=4
------------------------------
N=6
A=1B=0C=4D=5
K=5
------------------------------
N=6
A=2B=1C=3D=4
K=2
------------------------------
N=7
A=1B=0C=5D=6
K=6
------------------------------
N=8
A=0B=5C=7D=2
K=4
------------------------------
N=8
A=1B=0C=6D=7
K=7
------------------------------
N=8
A=2B=1C=5D=6
K=3
------------------------------
N=9
A=0B=5C=8D=3
K=6
------------------------------
N=9
A=1B=0C=7D=8
K=8
------------------------------
N=9
A=3B=2C=5D=6
K=2
------------------------------
N=10
A=1B=0C=8D=9
K=9
------------------------------
N=10
A=2B=1C=7D=8
K=4
------------------------------
N=11
A=1B=0C=9D=10
K=10
------------------------------
N=11
A=1B=2C=9D=8
K=7
------------------------------
N=11
A=1B=6C=9D=4
K=3
------------------------------
N=11
A=2B=9C=6D=8
K=3
------------------------------
N=12
A=1B=0C=10D=11
K=11
------------------------------
N=12
A=2B=1C=9D=10
K=5
------------------------------
N=12
A=3B=2C=8D=9
K=3
------------------------------
N=12
A=4B=3C=7D=8
K=2
------------------------------
N=13
A=1B=0C=11D=12
K=12
------------------------------
N=14
A=0B=9C=13D=4
K=7
------------------------------
N=14
A=1B=0C=12D=13
K=13
------------------------------
N=14
A=2B=1C=11D=12
K=6
------------------------------
N=15
A=0B=9C=14D=5
K=9
------------------------------
N=15
A=0B=11C=14D=3
K=5
------------------------------
N=15
A=1B=0C=2D=11
K=11
------------------------------
N=15
A=1B=0C=13D=14
K=14
------------------------------
N=15
A=3B=2C=11D=12
K=4
------------------------------
N=15
A=5B=4C=9D=10
K=2
------------------------------
N=16
A=0B=13C=4D=8
K=10
------------------------------
N=16
A=1B=0C=14D=15
K=15
------------------------------
N=16
A=2B=1C=13D=14
K=7
------------------------------
N=16
A=4B=3C=11D=12
K=3
------------------------------
End of solving