最大乘积(学习打卡day2/求助)

洛谷不通过怎么办,看了几遍也不知道怎么错了,求助大佬们

题目描述

一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+23=1+2,4=1+34=1+3,5=1+4=2+35=1+4=2+3,6=1+5=2+46=1+5=2+4。

现在你的任务是将指定的正整数 nn 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。

输入格式

只一个正整数 n,(3≤n≤10000)。

输出格式

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。

第二行是最大的乘积。

输入输出样例

输入 #1

10

输出 #1

2 3 5
30

代码

#include <stdio.h>
#include <math.h>
int n,remaind_num;
int cnt = 0;
void stockpile(int max[]) {
	int i;
	int temp = 0;
	for (i = 2;;i++) {
		temp += i;
		max[cnt] = i;
		cnt++;
		if (n - temp <= i) {
			remaind_num = n - temp;
			break;
		}
	}
}
void resolve(int max[]) {
	int flag = 1;
	int count = cnt - 2;
	for (int i = 0; i < remaind_num;i ++) {
		if (flag) {
			max[cnt-1] += 1;
			flag = 0;
		}
		else {
			if (max[count] != 2) {
				max[count] += 1;
				count--;
			}
			else {
				max[count] += 1;
				count = cnt -2;
				flag = 1;
			}
			
		}
	}
}
int main () {
	int max[100] = {0};
	scanf ("%d",&n);
	stockpile(max);
	resolve(max);
	int flat = 1;
	for (int i = 0;i < cnt;i++) {
		printf ("%d",max[i]);
		flat *= max[i];
		if (i != cnt -1) {
			printf (" ");
		}
		else printf ("\n");
	}
	printf ("%d",flat);
}

洛谷评分

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值