java中列表中数字的乘积

时间:2015-01-17 18:17:55

标签: java arraylist java-collections-api

我的任务是找到最小的正整数,说“A”,这样“A”的数字乘积恰好等于N.

示例:假设我的N = 32 所以我的A将是48因为32的除数将是1,2,4,8,16,32,并且使得32的最小数字是4和8.所以输出是48。

我所做的是先读N,然后找到除数并将它们存储在一个列表中。和使用

if(l.get(i)*l.get(i+1)==N) { sysout.print(l.get(i)); sysout.print(l.get(i+1));

但是我无法将数字设为最小值。如果没有匹配,我还需要打印为-1。

为此我做了:

if (l.get(i)*l.get(i+1)!=N) {
              System.out.print(-1);
break;
          }

但它最初只打印-1并中断。现在我被困在这里。请在下面找到我的代码:

我的代码:

int N=1;
     Scanner in = new Scanner(System.in);
     List<Integer> l = new ArrayList<Integer>();
      System.out.println("Enter N: ");
      if (N>=0 && N<=Math.pow(10, 9)) {
          N = in.nextInt();  
      }

      for (int i=1; i<=N;i++) {
          if (N%i==0) {
              l.add(i);
          }
      }
       System.out.println(l);
      for (int i=0; i<l.size()-1;i++) {
          if (l.get(i)*l.get(i+1)==N) {
              System.out.print(l.get(i));
              System.out.print(l.get(i+1));
          }

      }

     in.close();
亲切的帮助。感谢。

2 个答案:

答案 0 :(得分:1)

你在找到N上的除数时走在正确的轨道上。我不打算为你编码(你会通过这样做来学习更多)但是这就是你所做的:除数将被排序已经如此循环arraylist首先添加并找到min。 所以1,2,4,8,16,32:Find 1 + 32,2 + 16,4 + 8;然后在这些中获得最大值。

这是为了让你入门:

int first = 0;
int last = l.size()-1;

while(first<last){
 //Find min using Math.min;
 ++first;
 --last;
}

快乐的编码!

无法抗拒。下面是一个快速的方法来做你想要的。在这里测试过 (https://ideone.com/E0f4X9):

public class Test {
static ArrayList<Integer> nums = new ArrayList<>();

public static void main(String[] args){
    int N =32;
    findDivisors(N);

    int first = 0, a = 0, b = 0;
    int last = nums.size()-1;

    int results = Integer.MAX_VALUE;

    while(first < last){
        int sum = nums.get(first) + nums.get(last);
        results = Math.min(sum,results);
        a = nums.get(first);
        b = nums.get(last);
        first++;
        last--;
    }

    System.out.println(a+" "+b);
}

private static void findDivisors(int n){

    for(int i=1; i<=n; i++){
        if(n%i == 0){
            nums.add(i);
        }
     }
  }
}

答案 1 :(得分:0)

显然,如果N <10则A = N

否则A必须包含多个数字。 A的每个数字都是N的除数.A的更高有效数字必须小于或等于较低有效数字。否则,可以更改数字的顺序以产生较小的数字。

例如A不能是523,因为数字可以重新排列为235,这是一个较小的数字。在这个例子中,我们有2&lt; 3&lt; 5。

观察#1:当看到A时,最小的数字位于前面,数字会越来越高。

观察#2,如果 a b 的产品,则A永远不能包含两个数字 a b >也是一个数字。例如,永远不会有2和3,而是必须有6代替。可能永远不会有三个2,而是必须是8个。

这表明在构建A时我们应该从N的最高可能除数开始(因为9总是优于2 3,依此类推)。然后我们应该把这个数字放在A的末尾。

所以,虽然N&gt;在图10中,找到N的最高除数 x ,其是单个数字(2&lt; = x &lt; = 9)。将此值 x 添加到A的末尾。将 x 除以N并继续循环。

示例:

N = 126,A =?

小于或等于9的最高可能除数 x 9 。所以9将成为A的最后一位数。

将N除以9并重复此过程。 N =9分之126= 14

现在N = 14,A =?9

小于或等于9的最高可能除数 x 7 。我们找到了A的倒数第二位数。

将N除以7并重复此过程。 N = 14/7 = 2。

现在N = 2,A =?79

N'LT; 10。所以 2 是A的第一个数字。

解决方案是A = 279