我正在编写一个基本程序,它接受一个参数,然后根据该参数计算奇数的乘积。
如果我从1到19传递任何东西,但是在20,我的输出是负数,在35,它是0 ??
我确定算法有问题吗?
建议:
import java.util.ArrayList;
import java.util.List;
public class ProductOfIntegers {
public static void productOfOddIntegers(int i){
int[] numbers = new int[i];
for(int j = 0; j < numbers.length; j++){
numbers[j] = j + 1;
}
List<Integer> oddNumbers = new ArrayList<Integer>();
for(int j = 0; j < numbers.length; j++){
if(numbers[j] % 2 != 0){
oddNumbers.add(numbers[j]);
}
}
int product = 1;
for(int n: oddNumbers)
product*=n;
System.out.println(oddNumbers);
System.out.println(product);
}
public static void main(String [] args){
productOfOddIntegers(15);
}
}
答案 0 :(得分:1)
根据该参数计算奇数数字的乘积。
没有你的程序计算偶数的乘积。
这就是说,你的算法效率很低:不是先生成一个整数数组,然后过滤并最终计算产品,你可以简单地使用一个for
循环:
public static long productOfOddIntegers(int n){
long prod = 1;
for(int i = 3; i <= n; i += 2) {
prod *= i;
}
return prod;
}
您最好使用long
,因为此类产品可能相当庞大。毕竟,这与一个阶乘的根源相称。
您还可以使用BigInteger
方法,您可以使用任意 n :
public static BigInteger productOfOddIntegers(int n){
BigInteger prod = BigInteger.ONE;
BigInteger bin = new BigInteger(""+n);
BigInteger two = BigInteger.ONE.add(BigInteger.ONE);
for(BigInteger i = two.add(BigInteger.ONE); i.compareTo(bin) <= 0; i = i.add(two)) {
prod = prod.multiply(i);
}
return prod;
}
在方法中执行println
命令是糟糕的设计。您应该在计算和打印之间进行分离。