【发布时间】:2019-04-28 19:55:32
【问题描述】:
我正在解决一个编程挑战问题,但我的解决方案是为大量数字提供超时/错误。谁能帮我优化我的解决方案?
问题:
给定一个包含 N 个整数的数组 A。现在您需要固定 X 以使以下两个值之间的差异最小:
1. A[1] * A[2] * A[3] * ......... * A[X] 2. A[X+1] * A[X+2] * ........... * A[N]如果 X 的值更多,则打印最小的。
约束:
1 <= 1 <= 10^51 <= A[i] <= 10^18输入:
- 第一行包含整数 N(表示大小)
- 第二行包含空格分隔的数字(用于数组)
import java.util.*;
public class Main
{
public static void main(String[] args) {
Scanner s=new Scanner(System.in)
int size=Integer.parseInt(s.nextLine);
long arr[]=new long[size];
for(int i=0;i<=size;i++){
arr[i]=s.nextLong();
}
long part1=1,part2=1;
long diff=1;long minIndex=0;long minNo=0;
for(int k=0;k<size-1;k++){
part1=1;part2=1;
//minIndex=k;
for (int i=0;i<=k ; i++){
part1=part1*arr[i];
}
for(int j=k+1;j<=size;j++){
part2=part2*arr[j];
}
//System.out.println(part1+"---"+part2);
diff=Math.abs(part1-part2);
if(k==0){
minNo=diff;
minIndex=k;
}
//System.out.println(diff);
if(minNo>diff){
minNo=diff;
minIndex=k;
}
}
System.out.println("MinNo: "+minNo+" Index: "+minIndex);
}
}
我正在测试这个输入
5
9090909090909009 780009090900909 898989898898898 98998 9999776765576765
答案应该是 2(如果从零开始计数,则为 1),但我的代码给出的是 4。
【问题讨论】:
-
您正在获取非常大的数字的乘积。这些将超过 long 的最大值,因此您需要使用 BigInteger。
-
这不是最近在 HackerEarth 举办的比赛的一部分吗?
-
是的。比赛结束。