0

ここでの私の仕事は、「A」の数字の積が正確に N に等しくなるように「A」と言う最小の正の整数を見つけることです。

例: 私の 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 で除数を見つけることで正しい軌道に乗っています。私はあなたのためにそれをコーディングするつもりはありません (あなたはそれを行うことでより多くを学びます) が、ここではあなたがすることです: 除数はすでにソートされているので、arraylist を追加してループします最初から最後まで最小を見つけます。したがって、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、a と b の積も数字である場合、A に 2 つの数字ab含めることできません。たとえば、2 と 3 が存在することはあり得ず、代わりに 6 が存在する必要があります。2 が 3 つになることはあり得ず、代わりに 8 でなければなりません。

これは、A を構築するとき、N の可能な最大の除数から開始する必要があることを示唆しています (9 は常に 2 つの 3 よりも優れているなど)。次に、その数字を A の末尾に配置する必要があります。

したがって、N > 10 の間、1 桁 (2<= x <=9)である N の最大の除数xを見つけます。この値xを A の末尾に追加します。N をxで割り、ループを続行します。

例:

N=126、A=?

9 以下の最大の除数xは9です。したがって、9 は A の最後の桁になります。

N を 9 で割り、このプロセスを繰り返します。N=126/9=14。

現在 N=14、A=?9

9 以下の最大の除数xは7です。A の最後から 2 番目の桁が見つかりました。

N を 7 で割り、このプロセスを繰り返します。N=14/7=2。

現在 N=2、A=?79

N<10。2は A の 1 桁目です。

解はA=279

于 2015-01-17T20:41:03.673 に答える