设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
测试:
输入: 2 1 (2是位数,1是分几段)
15 (15是I)
输出:15
输入: 5 2
12345
输出:6170
#计算从高位数第i位到第j位组成的数字
def cal(num,i,j):
value=0
while j>=i:
value=value*10+eval(num[i])
i=i+1;
return value
def divide(n,k,num):
m=[[0 for i in range(k+1)] for j in range(n+1)]
#m[i][j] 表示前i位数字,分成j段
m[1][1]=eval(num[1])
for i in range(2,n+1):
m[i][1]=m[i-1][1]*10+eval(num[i]) #前i位数字,分成一段
for i in range(2,k+1):#分成多少段
Max=-1
#j从开始遍历到最后一位数,因为i<j时(如前3个数,分成4段),无意义,所以直接令j=i
#前j位数分成i段
for j in range(i,n+1):
for d in range(i-1,j):
#前d位数分成i-1段,d+1位到第j位是第i段
value=m[d][i-1]*cal(num,d+1,j)
if(value>Max):
Max=value
m[j][i]=Max
return m
#从文件中读出数据
file_readpath = 'input.txt'
with open(file_readpath) as file:
txt = file.read()
txt=txt.split('\n')
txt[0]=txt[0].split()
#n代表整数有n位,k指分成多少段
n,k=eval(txt[0][0]),eval(txt[0][1])
#第0个位置不用
num=['0']+list(txt[1])
m=divide(n,k,num)
#输出结果用于验证
for i in range(1,n+1):
print(m[i])
print("最大k乘积为:",m[n][k])
#将结果存入文件output.txt
file_writepath = 'output.txt'
file=open(file_writepath,"w")
file.write(str(m[n][k]))
file.close()