0分求助!!!
  • 板块P1249 最大乘积
  • 楼主BBY123
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/16 21:33
  • 上次更新2023/12/17 00:00:35
查看原帖
0分求助!!!
725794
BBY123楼主2023/12/16 21:33

求大佬指点!!!

/*本题思路:
	分两步进行:1.分解方案;2.输出乘积
	通过推算,我们知道:
		分解所得的数越多,乘得的乘积越大;
		而乘积最大就是连续的一串数,如果分解一串数后仍有余数,那就把这个数加到倒数第k个数上去,例:
			9=2+3+4
			10=2+3+4(+1)-->2+3+5
			11=2+3+4(+2)-->2+4+5
			12=2+3+4(+3)-->5+3+4
			13=2+3+4(+4)-->3+4+6
			14=2+3+4+5
			所以,k有两种情况:
				k<=位数,k+=倒数第k个数;
				k>位数,k+=2 
	再输出乘积,因为乘积很大,要进行高精度运算,最后输出*/ 
#include<bits/stdc++.h>
using namespace std;
int n,k,flag,c[1000001],s;
bool u[10001];//表示该数位是否被占用 
int gj(int x){
	int len = 1;
	for(int i = 1;i <= len;i++){//高精度乘单精度
    	c[i]*=x;
    }
    for(int i = 1;i <= len;i++){
    	c[i+1]+=c[i]/10;
    	c[i]%=10;
	}
	while(c[len+1]>9){
		len++;
		c[len+1]+=c[len]/10;
		c[len]%=10;
	}
	if(c[len+1]!=0) len++;
	return len;
}
int main(){
	cin>>n;
	k=n; 
	for(int i = 2;i <= n;i++){//循环找相邻的数 
		k-=i;
		u[i]=1;
		if(k<0){
			flag=i;//记录退出点 
			k+=i;//恢复 
			u[i]=0;//恢复 
			break;
		}
	}
	//分走剩下的k 
	if(k>flag-2){//k>位数时 
		u[2]=0;
		u[k+2]=1;
		flag=2+k;
	}
	else{//k<=位数时 
		u[flag]=1;
		u[flag-k]=0;
	}
	c[0]=c[1]=1;
	for(int i = 2;i <= flag;i++){
		if(u[i]){
			cout<<i<<" ";
			s=gj(i);
		}
	}
	cout<<endl;
	for(int i = s;i >= 1;i--){
		cout<<c[i];
	}
	return 0;
}
/*总结:
	做题时长:60min
	大改次数:0
	小改次数:4
	提交次数:1
	提交分数:0
	做题时间:2023.12.16*/
2023/12/16 21:33
加载中...