输入一个正整数,求取其平方根

import java.util.Scanner;




public class test01 {


/**
* @param args
* 输入一个正整数,求取其平方根
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入一个整数:");
Scanner reader = new Scanner(System.in);
double n = 0;
double y = 1.0;
n = reader.nextDouble();
while(Math.abs((1.0/2.0*(y+n/y))-y)>=0.00001)
    {
        y=1.0/2.0*(y+n/y);
        System.out.println(y);
    }


}


}
### 回答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个正整数之和,使得这些数的乘积最大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值