您的位置:首页 > 其它

使用5,7,12做加减运算,如果用最少步数得到任意数n

2011-06-27 15:32 393 查看
问题描述: 用5,7,12做加减运算,要求用最少步数得到任意数n

数学模型:

i * 5+ j * 7+k * 12=n n为任意正负整数

min(|i|+|j|+|k|)

分析:

对于-11到11,可手工算出

1 = +3 x 5 -2 x 7

2 = -1 x 5 +1 x 7

3 = +2 x 5 -1 x 7

4 = -2 x 5 +2 x 7

5 = +1 x 5 +0 x 7

6 = +4 x 5 -2 x 7

7 = 1 x 7

8 = +3 x 5 -1 x 7

9 = -1 x 5 +2 x 7

10 = +2 x 5

11 = -2 x 5 +3 x 7

...

即:

n=a*5+b*7 -11=<n=<11 (1)

对于其他整数,均可转化为12*m+x, |x|<12

12*m+x=n (2)

由式(1) and (2),得到

12*m+a*5+b*7=n (3)

由于m,a,b可以消减,要得到最小加减步数只能以如下顺序消减:

1.a,b同号时,利用5+7得到12从而消减掉5或7

2.m,a异号,则利用12-5消减得到7

3.m,b异号,则利用12-7消减得到5

消减完毕后,得到m,a,n,必须此作如下检查:

1.如果m=0,退出

2.如果m,a同号且|a|=6,则m=m-sign(a),a=0,b=b+sign(a)*5,如果|b|>12,则b=b-sign(b)*12,m=m+1

例如54=12*2+5*6,但最优解确是54=12+7*6。

python code:

#!/usr/bin/python
# coding=utf-8
# 算法:用5,7,12加减运算,求最少步数得到任意数n
# Filename test
# Date        Author     Comment E-mail
# 6/27/2011    Tony-Wu    V1.0    sywu@sohu.com

import getopt
import os
import os.path
import re
import string
import sys
import getpass
import urllib
import subprocess
import time

import andr_util

val_0_11=(
(0,0,0),
(3, -2, 0), (-1,1,0),(1,-2,1),(-2,2,0),(1,0,0),
(4,-2,0),(0,1,0),(3,-1,0),(-1,2,0),(2,0,0),
(5,-2,0));

def PrintUsage():
'''prints usage info.

Must provide at least one argument'''
print( "  usage: " + sys.argv[0] + " number")
print( "  usage: " + sys.argv[0] + " min max delta")
print("")
sys.exit(1)

def parseArgument():
global g_testFolder

if len(sys.argv) > 4 or len(sys.argv)<2:
PrintUsage()

def finalCheck(i,j,k,n):
if i != 5 and i != -5:
return (i,j,k)
if i>0 and k >0:
j=j+5
k=k-1
if j>12:
j-=12
k+=7
i=0
if i<0 and k <0:
j=j-5
k=k+1
if j<-12:
j+=12
k-=7
i=0
return (i,j,k)

def getMinStep(N):
k=int(N / 12)
left=N-k*12
j=int(left/7)
left=left-j*7
i=int(left/5)
left=left-i*5
if(left < 0):
i-=val_0_11[-left][0];
j-=val_0_11[-left][1];
k-=val_0_11[-left][2];
else:
i+=val_0_11[left][0];
j+=val_0_11[left][1];
k+=val_0_11[left][2];
if(i > 0 and j > 0) or (i <0 and j<0): #Merge to 12
merge12=min(abs(i),abs(j))
if i>0:
i-=merge12
j-=merge12
k+=merge12
else:
i+=merge12
j+=merge12
k-=merge12
elif (i * k < 0):
merge7=min(abs(i),abs(k))
if i>0:
i-=merge7
j-=merge7
k+=merge7
else:
i+=merge7
j+=merge7
k-=merge7
elif (j * k < 0):
merge5=min(abs(j),abs(k))
if j>0:
i-=merge5
j-=merge5
k+=merge5
else:
i+=merge5
j+=merge5
k-=merge5

res=finalCheck(i,j,k,N)

return res #(i,j,k)

if __name__ == '__main__':
parseArgument()

if len(sys.argv) > 2:
minVal=0
maxVal=0;
delta=1;
try:
minVal=int(sys.argv[1])
maxVal=int(sys.argv[2])+1
delta=int(sys.argv[3])
except IndexError:
print("get paraemter error")
for x in range(minVal,maxVal,delta):
res=getMinStep(int(x))
print("%d \t = %+d x 5 \t %+d x 7 \t %+d x 12"%(x,res[0],res[1],res[2]))
else:
res=getMinStep(int(sys.argv[1]))
print("%d \t = %+d x 5 \t %+d x 7 \t %+d x 12"%(int(sys.argv[1]),res[0],res[1],res[2]))


执行命令:

test.py -100 100 1

计算结果:

-100 	 = +0 x 5 	 -4 x 7 	 -6 x 12
-99 	 = -3 x 5 	 +0 x 7 	 -7 x 12
-98 	 = +0 x 5 	 -2 x 7 	 -7 x 12
-97 	 = +0 x 5 	 -5 x 7 	 -5 x 12
-96 	 = +0 x 5 	 +0 x 7 	 -8 x 12
-95 	 = +0 x 5 	 -5 x 7 	 -5 x 12
-94 	 = -2 x 5 	 +0 x 7 	 -7 x 12
-93 	 = +0 x 5 	 -3 x 7 	 -6 x 12
-92 	 = -4 x 5 	 +0 x 7 	 -6 x 12
-91 	 = +0 x 5 	 -1 x 7 	 -7 x 12
-90 	 = -6 x 5 	 +0 x 7 	 -5 x 12
-89 	 = -1 x 5 	 +0 x 7 	 -7 x 12
-88 	 = +0 x 5 	 -4 x 7 	 -5 x 12
-87 	 = -3 x 5 	 +0 x 7 	 -6 x 12
-86 	 = +0 x 5 	 -2 x 7 	 -6 x 12
-85 	 = +0 x 5 	 -5 x 7 	 -4 x 12
-84 	 = +0 x 5 	 +0 x 7 	 -7 x 12
-83 	 = +0 x 5 	 -5 x 7 	 -4 x 12
-82 	 = -2 x 5 	 +0 x 7 	 -6 x 12
-81 	 = +0 x 5 	 -3 x 7 	 -5 x 12
-80 	 = -4 x 5 	 +0 x 7 	 -5 x 12
-79 	 = +0 x 5 	 -1 x 7 	 -6 x 12
-78 	 = -6 x 5 	 +0 x 7 	 -4 x 12
-77 	 = -1 x 5 	 +0 x 7 	 -6 x 12
-76 	 = +0 x 5 	 -4 x 7 	 -4 x 12
-75 	 = -3 x 5 	 +0 x 7 	 -5 x 12
-74 	 = +0 x 5 	 -2 x 7 	 -5 x 12
-73 	 = +0 x 5 	 -5 x 7 	 -3 x 12
-72 	 = +0 x 5 	 +0 x 7 	 -6 x 12
-71 	 = +0 x 5 	 -5 x 7 	 -3 x 12
-70 	 = -2 x 5 	 +0 x 7 	 -5 x 12
-69 	 = +0 x 5 	 -3 x 7 	 -4 x 12
-68 	 = -4 x 5 	 +0 x 7 	 -4 x 12
-67 	 = +0 x 5 	 -1 x 7 	 -5 x 12
-66 	 = -6 x 5 	 +0 x 7 	 -3 x 12
-65 	 = -1 x 5 	 +0 x 7 	 -5 x 12
-64 	 = +0 x 5 	 -4 x 7 	 -3 x 12
-63 	 = -3 x 5 	 +0 x 7 	 -4 x 12
-62 	 = +0 x 5 	 -2 x 7 	 -4 x 12
-61 	 = +0 x 5 	 -5 x 7 	 -2 x 12
-60 	 = +0 x 5 	 +0 x 7 	 -5 x 12
-59 	 = +0 x 5 	 -5 x 7 	 -2 x 12
-58 	 = -2 x 5 	 +0 x 7 	 -4 x 12
-57 	 = +0 x 5 	 -3 x 7 	 -3 x 12
-56 	 = -4 x 5 	 +0 x 7 	 -3 x 12
-55 	 = +0 x 5 	 -1 x 7 	 -4 x 12
-54 	 = -6 x 5 	 +0 x 7 	 -2 x 12
-53 	 = -1 x 5 	 +0 x 7 	 -4 x 12
-52 	 = +0 x 5 	 -4 x 7 	 -2 x 12
-51 	 = -3 x 5 	 +0 x 7 	 -3 x 12
-50 	 = +0 x 5 	 -2 x 7 	 -3 x 12
-49 	 = +0 x 5 	 -5 x 7 	 -1 x 12
-48 	 = +0 x 5 	 +0 x 7 	 -4 x 12
-47 	 = +0 x 5 	 -5 x 7 	 -1 x 12
-46 	 = -2 x 5 	 +0 x 7 	 -3 x 12
-45 	 = +0 x 5 	 -3 x 7 	 -2 x 12
-44 	 = -4 x 5 	 +0 x 7 	 -2 x 12
-43 	 = +0 x 5 	 -1 x 7 	 -3 x 12
-42 	 = -6 x 5 	 +0 x 7 	 -1 x 12
-41 	 = -1 x 5 	 +0 x 7 	 -3 x 12
-40 	 = +0 x 5 	 -4 x 7 	 -1 x 12
-39 	 = -3 x 5 	 +0 x 7 	 -2 x 12
-38 	 = +0 x 5 	 -2 x 7 	 -2 x 12
-37 	 = +0 x 5 	 -5 x 7 	 +0 x 12
-36 	 = +0 x 5 	 +0 x 7 	 -3 x 12
-35 	 = +0 x 5 	 -5 x 7 	 +0 x 12
-34 	 = -2 x 5 	 +0 x 7 	 -2 x 12
-33 	 = +0 x 5 	 -3 x 7 	 -1 x 12
-32 	 = -4 x 5 	 +0 x 7 	 -1 x 12
-31 	 = +0 x 5 	 -1 x 7 	 -2 x 12
-30 	 = -6 x 5 	 +0 x 7 	 +0 x 12
-29 	 = -1 x 5 	 +0 x 7 	 -2 x 12
-28 	 = +0 x 5 	 -4 x 7 	 +0 x 12
-27 	 = -3 x 5 	 +0 x 7 	 -1 x 12
-26 	 = +0 x 5 	 -2 x 7 	 -1 x 12
-25 	 = -5 x 5 	 +0 x 7 	 +0 x 12
-24 	 = +0 x 5 	 +0 x 7 	 -2 x 12
-23 	 = +1 x 5 	 -4 x 7 	 +0 x 12
-22 	 = -2 x 5 	 +0 x 7 	 -1 x 12
-21 	 = +0 x 5 	 -3 x 7 	 +0 x 12
-20 	 = -4 x 5 	 +0 x 7 	 +0 x 12
-19 	 = +0 x 5 	 -1 x 7 	 -1 x 12
-18 	 = -5 x 5 	 +1 x 7 	 +0 x 12
-17 	 = -1 x 5 	 +0 x 7 	 -1 x 12
-16 	 = +1 x 5 	 -3 x 7 	 +0 x 12
-15 	 = -3 x 5 	 +0 x 7 	 +0 x 12
-14 	 = +0 x 5 	 -2 x 7 	 +0 x 12
-13 	 = -4 x 5 	 +1 x 7 	 +0 x 12
-12 	 = +0 x 5 	 +0 x 7 	 -1 x 12
-11 	 = +2 x 5 	 -3 x 7 	 +0 x 12
-10 	 = -2 x 5 	 +0 x 7 	 +0 x 12
-9 	 = +1 x 5 	 -2 x 7 	 +0 x 12
-8 	 = -3 x 5 	 +1 x 7 	 +0 x 12
-7 	 = +0 x 5 	 -1 x 7 	 +0 x 12
-6 	 = -4 x 5 	 +2 x 7 	 +0 x 12
-5 	 = -1 x 5 	 +0 x 7 	 +0 x 12
-4 	 = +2 x 5 	 -2 x 7 	 +0 x 12
-3 	 = -2 x 5 	 +1 x 7 	 +0 x 12
-2 	 = +1 x 5 	 -1 x 7 	 +0 x 12
-1 	 = -3 x 5 	 +2 x 7 	 +0 x 12
0 	 = +0 x 5 	 +0 x 7 	 +0 x 12
1 	 = +3 x 5 	 -2 x 7 	 +0 x 12
2 	 = -1 x 5 	 +1 x 7 	 +0 x 12
3 	 = +2 x 5 	 -1 x 7 	 +0 x 12
4 	 = -2 x 5 	 +2 x 7 	 +0 x 12
5 	 = +1 x 5 	 +0 x 7 	 +0 x 12
6 	 = +4 x 5 	 -2 x 7 	 +0 x 12
7 	 = +0 x 5 	 +1 x 7 	 +0 x 12
8 	 = +3 x 5 	 -1 x 7 	 +0 x 12
9 	 = -1 x 5 	 +2 x 7 	 +0 x 12
10 	 = +2 x 5 	 +0 x 7 	 +0 x 12
11 	 = -2 x 5 	 +3 x 7 	 +0 x 12
12 	 = +0 x 5 	 +0 x 7 	 +1 x 12
13 	 = +4 x 5 	 -1 x 7 	 +0 x 12
14 	 = +0 x 5 	 +2 x 7 	 +0 x 12
15 	 = +3 x 5 	 +0 x 7 	 +0 x 12
16 	 = -1 x 5 	 +3 x 7 	 +0 x 12
17 	 = +1 x 5 	 +0 x 7 	 +1 x 12
18 	 = +5 x 5 	 -1 x 7 	 +0 x 12
19 	 = +0 x 5 	 +1 x 7 	 +1 x 12
20 	 = +4 x 5 	 +0 x 7 	 +0 x 12
21 	 = +0 x 5 	 +3 x 7 	 +0 x 12
22 	 = +2 x 5 	 +0 x 7 	 +1 x 12
23 	 = -1 x 5 	 +4 x 7 	 +0 x 12
24 	 = +0 x 5 	 +0 x 7 	 +2 x 12
25 	 = +5 x 5 	 +0 x 7 	 +0 x 12
26 	 = +0 x 5 	 +2 x 7 	 +1 x 12
27 	 = +3 x 5 	 +0 x 7 	 +1 x 12
28 	 = +0 x 5 	 +4 x 7 	 +0 x 12
29 	 = +1 x 5 	 +0 x 7 	 +2 x 12
30 	 = +6 x 5 	 +0 x 7 	 +0 x 12
31 	 = +0 x 5 	 +1 x 7 	 +2 x 12
32 	 = +4 x 5 	 +0 x 7 	 +1 x 12
33 	 = +0 x 5 	 +3 x 7 	 +1 x 12
34 	 = +2 x 5 	 +0 x 7 	 +2 x 12
35 	 = +0 x 5 	 +5 x 7 	 +0 x 12
36 	 = +0 x 5 	 +0 x 7 	 +3 x 12
37 	 = +0 x 5 	 +5 x 7 	 +0 x 12
38 	 = +0 x 5 	 +2 x 7 	 +2 x 12
39 	 = +3 x 5 	 +0 x 7 	 +2 x 12
40 	 = +0 x 5 	 +4 x 7 	 +1 x 12
41 	 = +1 x 5 	 +0 x 7 	 +3 x 12
42 	 = +6 x 5 	 +0 x 7 	 +1 x 12
43 	 = +0 x 5 	 +1 x 7 	 +3 x 12
44 	 = +4 x 5 	 +0 x 7 	 +2 x 12
45 	 = +0 x 5 	 +3 x 7 	 +2 x 12
46 	 = +2 x 5 	 +0 x 7 	 +3 x 12
47 	 = +0 x 5 	 +5 x 7 	 +1 x 12
48 	 = +0 x 5 	 +0 x 7 	 +4 x 12
49 	 = +0 x 5 	 +5 x 7 	 +1 x 12
50 	 = +0 x 5 	 +2 x 7 	 +3 x 12
51 	 = +3 x 5 	 +0 x 7 	 +3 x 12
52 	 = +0 x 5 	 +4 x 7 	 +2 x 12
53 	 = +1 x 5 	 +0 x 7 	 +4 x 12
54 	 = +6 x 5 	 +0 x 7 	 +2 x 12
55 	 = +0 x 5 	 +1 x 7 	 +4 x 12
56 	 = +4 x 5 	 +0 x 7 	 +3 x 12
57 	 = +0 x 5 	 +3 x 7 	 +3 x 12
58 	 = +2 x 5 	 +0 x 7 	 +4 x 12
59 	 = +0 x 5 	 +5 x 7 	 +2 x 12
60 	 = +0 x 5 	 +0 x 7 	 +5 x 12
61 	 = +0 x 5 	 +5 x 7 	 +2 x 12
62 	 = +0 x 5 	 +2 x 7 	 +4 x 12
63 	 = +3 x 5 	 +0 x 7 	 +4 x 12
64 	 = +0 x 5 	 +4 x 7 	 +3 x 12
65 	 = +1 x 5 	 +0 x 7 	 +5 x 12
66 	 = +6 x 5 	 +0 x 7 	 +3 x 12
67 	 = +0 x 5 	 +1 x 7 	 +5 x 12
68 	 = +4 x 5 	 +0 x 7 	 +4 x 12
69 	 = +0 x 5 	 +3 x 7 	 +4 x 12
70 	 = +2 x 5 	 +0 x 7 	 +5 x 12
71 	 = +0 x 5 	 +5 x 7 	 +3 x 12
72 	 = +0 x 5 	 +0 x 7 	 +6 x 12
73 	 = +0 x 5 	 +5 x 7 	 +3 x 12
74 	 = +0 x 5 	 +2 x 7 	 +5 x 12
75 	 = +3 x 5 	 +0 x 7 	 +5 x 12
76 	 = +0 x 5 	 +4 x 7 	 +4 x 12
77 	 = +1 x 5 	 +0 x 7 	 +6 x 12
78 	 = +6 x 5 	 +0 x 7 	 +4 x 12
79 	 = +0 x 5 	 +1 x 7 	 +6 x 12
80 	 = +4 x 5 	 +0 x 7 	 +5 x 12
81 	 = +0 x 5 	 +3 x 7 	 +5 x 12
82 	 = +2 x 5 	 +0 x 7 	 +6 x 12
83 	 = +0 x 5 	 +5 x 7 	 +4 x 12
84 	 = +0 x 5 	 +0 x 7 	 +7 x 12
85 	 = +0 x 5 	 +5 x 7 	 +4 x 12
86 	 = +0 x 5 	 +2 x 7 	 +6 x 12
87 	 = +3 x 5 	 +0 x 7 	 +6 x 12
88 	 = +0 x 5 	 +4 x 7 	 +5 x 12
89 	 = +1 x 5 	 +0 x 7 	 +7 x 12
90 	 = +6 x 5 	 +0 x 7 	 +5 x 12
91 	 = +0 x 5 	 +1 x 7 	 +7 x 12
92 	 = +4 x 5 	 +0 x 7 	 +6 x 12
93 	 = +0 x 5 	 +3 x 7 	 +6 x 12
94 	 = +2 x 5 	 +0 x 7 	 +7 x 12
95 	 = +0 x 5 	 +5 x 7 	 +5 x 12
96 	 = +0 x 5 	 +0 x 7 	 +8 x 12
97 	 = +0 x 5 	 +5 x 7 	 +5 x 12
98 	 = +0 x 5 	 +2 x 7 	 +7 x 12
99 	 = +3 x 5 	 +0 x 7 	 +7 x 12
100 	 = +0 x 5 	 +4 x 7 	 +6 x 12


Forum Discuss Thread http://topic.csdn.net/u/20110621/09/ddb72b75-24ae-4b61-b908-90860ed5e410.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐