题目链接:最大乘积
这道题单单从数学角度上我就思考了很久,一直找不出规律,最后看了评论区大佬的思路才明白,附上评论区题解。
评论区题解
“本题要先用简单的数论和贪心找到最优解的组成方法,再用高精度乘法求积。”
其实我一开始忽略了高精度,以后还是要多注意。
==============================================
另外,写代码过程中遇到的问题:
1.29行:字符串string的赋值。s3+=num3[i]+‘0’; 我一开始写的是s[i]=num3[i]+‘0’,以至于出现了字符串的长度恒为零的情况。
2.12行:把整数转化成数组的过程中,忘记把len2++放在循环里面(一开始我是放在if(!k)的条件里),导致len2恒为1(只有在退出循环的时候自加了一次)。这个错误很低级,我找了很久…
3.57行:学习了一下别人的代码风格,函数带有返回值,我之前都是没有返回值,全部作为全局变量使用,这个方式不太好。
==============================================
评论区还有另一种方法:dp,下一次学习完再放上来。(dp不懂!!!)
#include<iostream>
#define MAXN 1005
using namespace std;
int n,c=1,len1,len2=0,len3;
int num[MAXN],num1[MAXN],num2[6],num3[MAXN];
string m="1",s3;
string mul(string s1,int k)
{
s3="";
len1=s1.length();
len2=0;
for(int i=0;k>0;i++){
num2[i]=k%10;
k/=10;
len2++;
}
for(int i=0;i<len1;i++) num1[i]=s1[i]-'0';
for(int i=0;i<len1;i++)
for(int j=0;j<len2;j++)
num3[i+j]+=num1[i]*num2[j];
len3=len1+len2;
for(int i=0;i<len3;i++){
if(num3[i]>=10){
num3[i+1]+=num3[i]/10;
num3[i]%=10;
}
}
while(num3[len3-1]==0) len3--;
for(int i=0;i<len3;i++) s3+=num3[i]+'0';
for(int i=0;i<len3;i++) num3[i]=0;
return s3;
}
int main(void)
{
cin>>n;
//n<=4
if(n<=4){
cout<<n<<" "<<n;
return 0;
}
int c=1;
for(int i=2;;i++){
if(n>=i){
n-=i;
num[c++]=i;
}
else break;
}
for(int i=c-1;i>=1;i--){
if(!n) break;
num[i]++;
n--;
}
if(n>0) num[c-1]++;
for(int i=1;i<c;i++){
cout<<num[i]<<" ";
m=mul(m,num[i]);
}
cout<<endl;
for(int i=m.length()-1;i>=0;i--) cout<<m[i];
return 0;
}