最大k乘积问题--Python

设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()

发布了28 篇原创文章 · 获赞 4 · 访问量 2487

猜你喜欢

转载自blog.csdn.net/weixin_45050042/article/details/102788248