【洛谷训练】最大乘积

题目链接:最大乘积

这道题单单从数学角度上我就思考了很久,一直找不出规律,最后看了评论区大佬的思路才明白,附上评论区题解。
评论区题解
“本题要先用简单的数论和贪心找到最优解的组成方法,再用高精度乘法求积。”
其实我一开始忽略了高精度,以后还是要多注意。
==============================================
另外,写代码过程中遇到的问题:
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;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值