import java.util.Scanner;
class my
{
public static void main()
{
Scanner sc = new Scanner(System.in);
int t;
int a[] = new int[5];
int l = a.length;
int prod[] = new int[100];
int index[] = new int[100];
int n;
System.out.println("enter a elements into array ");
for(int i = 0;i<5;i++)
{
a[i] = sc.nextInt();
}
for(int i = 0 ;i<4;i++)
{
for(int j = 0;j<(4-i);j++)
{
if(a[j]>a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
System.out.println("enter a number");
n = sc.nextInt();
for(int i = 0;i<l-1;i++)
{
prod[i] = a[i]*a[i+1];
index[i] = a[i];
index[i+1]=a[i+1];
}
for(int i = 0;i<l;i++)
{
if(prod[i]!=0)
System.out.println(prod[i]);
}
for(int i = 0;i<l-1;i++)
{
if(n>prod[i]&&n<=prod[i+1])
System.out.println(index[i+1]+"\t"+index[i+2]);
}
}
}
如果要在数组中显示最接近的对产品,该产品最接近输入的数字。但是当我输入数组元素1,2,3,5,4时 进入数组后,我输入数字8,显示3,4对数组而不是5,2。答案是5,2,因为5 * 2的乘积是10,最接近输入的数字是8。
答案 0 :(得分:1)
代码的问题在于它只是计算两个连续元素的乘积,而不是简单地将它与其他元素的乘积进行比较,这不是正确的方法。
由于您对数组进行排序,因此使用二进制搜索的逻辑更好的方法。并且最接近x的对的乘积具有最小差异的逻辑。
您可以使用的算法如下:
1. Make a variable difference and initialize to Integer.MAX_VALUE;
2. Now traverse the array from both the direction, i.e set index of left = 0, and right = arr.length -1.
3. Loop while left < right.
(a) If abs((arr[left] * arr[right]) - x) < difference
then update difference and result
(b) if((arr[left] * arr[right]) < x) then
left++
(c) Else right--
时间复杂度:O(nlog(n))
答案 1 :(得分:0)
我不明白为什么你的解决方案中有如此多的循环和如此多的变量。您也不需要对数组a
进行排序。
在伪代码中:
var a[]
var n
var closest = MAX_INTEGER
var closest_i
var closest_j
for i in range [0, a.length)
for j in range [i + 1, a.length)
var distance = abs(a[i] * a[j] - n)
if distance < closest
closest = distance
closest_i = i
closest_j = j
请注意,这会有O(n)
时间复杂度。