【第10题】给定 n 和 n 个正整数,输出它们的平均数

100 篇文章 538 订阅 ¥999.99 ¥499.90
本文是C语言学习的第十天打卡内容,主要讲解一道求正整数平均数的题目。通过循环输入n个正整数,计算并输出其平均值,保留两位小数。文章包含解题思路、代码详解,并推荐了相关学习资源。
摘要由CSDN通过智能技术生成

零、写在前面

  目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券
  今天是学习 「 C语言 」 打卡的第十天,学习方式很简单,每天我会提供一篇文章供群成员阅读,阅读完本文,做完课后的 「习题练习 」 ,在 万人千题 社区对应的 「 打卡帖 」 下打卡,今天的任务就算完成了。
  很多人问,打卡的时候提示需要填写一个 「 链接 」,可以不用理会,直接提交 「 打卡 」 二字。也可以填写自己对今天打卡的 「 心得和感悟 」,或者 「 解题报告 」
  因为大家都在学习,所以一旦遇到问题都可以在群里问,群成员能够做出更加快速的反馈,高效的达成学习的目的。学有余力的同学可以在 万人千题 社区发布每天练习的解题报告。

### 回答1: 这个问可以使用动态规划来解决。 设 $f_i$ 表示将 $i$ 分解为若干正整数之和,使得这些正整数的乘积最大,所得到的最大乘积。 显然,当 $i=2$ 时,只能将 $2$ 分解为 $1+1$,乘积为 $1$。 当 $i \geq 3$ 时,可以将 $i$ 分解成两个正整数 $j$ 和 $i-j$ 的和,或者将 $i$ 分解成三个及以上正整数之和。 对于第一种情况,分解出来的两个正整数的乘积为 $j \times (i-j)$,因此 $f_i$ 可以通过更新 $f_j \times f_{i-j}$ 来计算。 对于第二种情况,假设将 $i$ 分解成 $a_1 + a_2 + \cdots + a_k$,其中 $k \geq 3$,则 $f_i$ 可以通过更新 $f_{a_1} \times f_{a_2} \times \cdots \times f_{a_k}$ 来计算。 综上所述,我们可以得到以下状态转移方程: $$ f_i = \max\{j \times (i-j), f_{a_1} \times f_{a_2} \times \cdots \times f_{a_k}\} $$ 其中 $j$ 取遍 $1,2,\cdots,i-1$,$a_1,a_2,\cdots,a_k$ 的取值满足 $a_1+a_2+\cdots+a_k=i$。 下面是 Python 代码实现: ```python def max_product(n: int) -> int: if n <= 2: return 1 f = [0] * (n + 1) f[1] = 1 f[2] = 1 for i in range(3, n+1): for j in range(1, i): f[i] = max(f[i], j * (i-j), f[j] * f[i-j]) return f[n] ``` 例如,对于输入 $n=10$,输出为 $36$,即 $10=3+3+4$ 时,这些的乘积最大,为 $3 \times 3 \times 4=36$。 ### 回答2: 要取使这些相乘最大的结果,可以通过贪心算法来实现。首先,我们观察到,当n为2或3时,无论怎样分割,其乘积都小于等于n本身。因此,对于n大于3的情况,我们可以将其分为尽可能多的3和尽量少的2。 假设n可以表示为3的个数x和2的个数y的和,即n = 3x + 2y。那么我们可以得到以下几个结论: 1. 当y为0时,即n为3的倍时,最大乘积为3的x次方。 2. 当y为1时,我们可以将一个2和一个3组合为1个6,此时最大乘积为2 * 3^(x-1)。 3. 当y为2时,最大乘积为2^2 * 3^x。 4. 当y为3时,我们可以将三个2组合为一个8和一个1,此时最大乘积为2^3 * 3^(x-1)。 通过观察以上情况,我们可以发现,当y大于等于4时,我们可以将4个2组合为一个8和一个1,此时的乘积一定大于y为3时的情况。因此,我们可以得出一个规律,即当n大于3时,最大乘积结果为2的y次方 * 3的x次方。 综上所述,对于一个大于1的整n,我们可以先将其分解成尽可能多的3和尽量少的2,再将分解后的3的个数x和2的个数y代入公式 2^y * 3^x ,即为所求的最大乘积结果。 ### 回答3: 给定一个大于1的整n,我们需要将n分解成若干个正整数之和,并找到这些相乘的最大结果。 假设我们将n分解成k个正整数之和,可以设这k个正整数为x1, x2, ..., xk。那么我们的目标是找到这些的乘积最大值。 首先,我们可以发现当这k个数尽量均匀分布时,它们的乘积最大。也就是说,我们需要将n平均分成k个数,即x1 = x2 = ... = xk = n/k。 但是由于n和k可能无法整除,所以我们需要取整部分,即令x1 = x2 = ... = x_{k-1} = n/k,而最后一个数xk = n - (k-1)(n/k)。 接下来,我们考虑如何选择k的值,使得乘积最大。我们可以发现,当k接近于n的平方根时,乘积最大。 为什么呢?假设k=n的平方根+1,即k = sqrt(n)+1。那么n/k = sqrt(n),而(n - (k-1)(n/k)) = 2*sqrt(n)。这样,我们得到的k个数之积为sqrt(n)^(k-1) * 2*sqrt(n) = 2n^(k/2)。 可以看到,如果k稍微大于sqrt(n),我们得到的乘积会更大。 因此,我们可以选择k = int(sqrt(n)) + 1,即将n分成int(sqrt(n))+1个数之和,其中int(x)表示取x的整部分。 综上所述,我们可以将输入的大于1的整n分解成int(sqrt(n))+1个正整数之和,使得这些的乘积最大。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值