0

我的任务是找到最小的正整数,比如“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();

请帮助。谢谢。

4

2 回答 2

1

您在 N 上找到除数的方法是正确的。我不会为您编写代码(您将通过这样做了解更多信息),但您要做的是:除数已经排序,因此循环添加数组列表从头到尾并找到最小值。所以对于 1、2、4、8、16、32:求 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);
        }
     }
  }
}
于 2015-01-17T18:55:45.137 回答
0

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

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

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

观察 #1:当查看 A 时,最小的数字在前面,数字在最后变得更高。

观察 #2,如果ab的乘积也是一个数字,则A 永远不能包含两个数字ab。例如,永远不可能有 2 和 3,而是必须有 6。永远不可能有三个 2,而必须是 8。

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

因此,当 N > 10 时,找到 N 的最大除数x,它是一位数 (2<= x <=9)。将此值x添加到 A 的末尾。将 N 除以x并继续循环。

例子:

N=126, A=?

小于或等于 9 的最大可能除数x9。所以 9 将是 A 的最后一个数字。

将 N 除以 9 并重复该过程。N=126/9=14。

现在 N=14, A=?9

小于或等于 9 的最大可能除数x7。我们找到了 A 的倒数第二个数字。

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

现在 N=2, A=?79

N<10。所以2是 A 的第一个数字。

解是 A=279

于 2015-01-17T20:41:03.673 回答