Description
| | |
| 设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的 乘积称为I的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。 对于给定的I和k,计算 I的最大 k乘积。 | |
| | |
Input
| | |
| 第1 行中有2个正整数n和 k。正整数 n是序列
的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10) | |
| | |
Output
Sample Input
Sample Output
#include<iostream>
using namespace std;
#define N 20
int m[N][N];
char num[N];
int atoi(char arr[],int i,int j)
{
int sum=0;
while(i<=j)
{
sum = sum*10+arr[i]-'0'; //此处本来用了函数pow,然后wa了,一直找不到错在何处,
i++; //后来问师兄,才发现原来pow(double,int)
} //的参数double会使结果又偏差,改掉后就ac了
return sum;
}
int main()
{
int n,k,i,j,l,max,flag;
while(cin>>n>>k)
{
for(i=1;i<=n;i++)
cin>>num[i];
m[1][1]=num[1]-'0';
for(i=2;i<=n;i++)
m[i][1]=m[i-1][1]*10+(num[i]-'0'); //初始化第一列
for(j=2;j<=k;j++)//按列进行初始化
{
max=-1;
for(i=1;i<=n;i++)
{
if(j>i)
m[i][j]=0;
else
{
for(l=j-1;l<=i-1;l++)
{
flag=m[l][j-1]*atoi(num,l+1,i);
if(flag>max)
max=flag;
}
m[i][j]=max;
}
}
}
cout<<m[n][k]<<endl;
}
return 0;
}
//****************************************************************************
改进:对于atoi这个函数实现的功能可进行打表,这样可以加快程序运行速度
//****************************************************************************