web-dev-qa-db-ja.com

与えられた整数の因数を見つける

私はこのようなものを持っています:

int f = 120;
for(int ff = 1; ff <= f; ff++){
    while (f % ff != 0){            
}

要因を見つけるためのループに何か問題がありますか? forステートメントとwhileステートメントの動作については本当に混乱しているので、完全に間違っている可能性があります。

この後、変数を上記の要素に割り当てるにはどうすればよいですか?

6
Wilson
public class Solution {
    public ArrayList<Integer> allFactors(int a) {

        int upperlimit = (int)(Math.sqrt(a));
        ArrayList<Integer> factors = new ArrayList<Integer>();
        for(int i=1;i <= upperlimit; i+= 1){
            if(a%i == 0){
                factors.add(i);
                if(i != a/i){
                    factors.add(a/i);
                }
            }
        }
        Collections.sort(factors);
        return factors;
    }
}

上記のソリューションは、素因数の計算と同じように機能します。違いは、すべての素因数について、製品の他の部分、つまり必要な数を計算し続けます。

10
Sharad Dargan

次のコードは、指定された数のすべての因子のリストを返します。

_public ArrayList<Integer> findFactors(int num) {        
    ArrayList<Integer> factors = new ArrayList<Integer>();

    // Skip two if the number is odd
    int incrementer = num % 2 == 0 ? 1 : 2;

    for (int i = 1; i <= Math.sqrt(num); i += incrementer) {

        // If there is no remainder, then the number is a factor.
        if (num % i == 0) {
            factors.add(i);

            // Skip duplicates
            if (i != num / i) {
                factors.add(num / i);
            }

        }
    }

    // Sort the list of factors
    Collections.sort(factors);

    return factors;
}
_

この答えは改善されます Sharad Darganの答え 2つの方法で:

  1. この回答 で使用されているアイデアに基づいて、数値が偶数か奇数かに基づいてインクリメントする値を決定することにより、ソリューションを高速化できます。

    Forループの前に次のコード行を追加します。

    _int incrementer = num % 2 == 0 ? 1 : 2;
    _

    次に、ループの最後の部分を次のように変更します。

    _ i += incrementer
    _

    数が奇数の場合、何があっても常に1ずつ増加するのではなく、すべての偶数をスキップします。

  2. Sharadは上限値を変数に格納し、その変数をforループで使用します。

    _int upperlimit = (int)(Math.sqrt(a));
    ...
    for(int i = 1; i <= upperlimit; i+= 1)
    _

    代わりに、Math.sqrt(num)をforループに直接配置し、上限変数をスキップします。

    _for (int i = 1; i <= Math.sqrt(num); i += incrementer) {
    _

    これにより、コードのキャスト部分をスキップして、よりクリーンなコードを作成できます。


次に使用できるいくつかのJUnitテストケース:

_@Test
public void test12() {
    FindFactors find = new FindFactors();

    int num = 12;
    List<Integer> factors = Arrays.asList(1, 2, 3, 4, 6, 12);

    assertEquals(factors, find.findFactors(num));
}

@Test
public void test1000000() {
    FindFactors find = new FindFactors();

    int num = 1000000;
    List<Integer> factors = Arrays.asList(1, 2, 4, 5, 8, 10, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 160, 200,
            250, 320, 400, 500, 625, 800, 1000, 1250, 1600, 2000, 2500, 3125, 4000, 5000, 6250, 8000, 10000, 12500,
            15625, 20000, 25000, 31250, 40000, 50000, 62500, 100000, 125000, 200000, 250000, 500000, 1000000);

    assertEquals(factors, find.findFactors(num));
}

@Test
public void test1() {
    FindFactors find = new FindFactors();

    int num = 1;
    List<Integer> factors = Arrays.asList(1);

    assertEquals(factors, find.findFactors(num));
}

@Test
public void test0() {
    FindFactors find = new FindFactors();

    int num = 0;
    List<Integer> factors = new ArrayList<Integer>();

    assertEquals(factors, find.findFactors(num));
}
_
10
Tot Zam

指定された数のすべての因子を取得する方法は次のとおりです。

public class Factors {

    public static void main(String[] args){
        int n = 420;

        for(int i=2; i<=n; i++){
            while(n%i==0){
                System.out.println(i + "| " + n);
                System.out.println(" -----");
                n = n/i;
            }
        }
    }
}

出力:

2| 420
 -----
2| 210
 -----
3| 105
 -----
5| 35
 -----
7| 7
 -----
9
zdesam

与えられた数の因数を見つけるために、あなたは与えられた数の平方根までチェックする必要があるだけです。

たとえば、6の因数を見つけるには、2.45(√6)までチェックするだけで済みます。 6の因数は1と2であり、それらの逆の数、つまり3と6になります。

与えられた数の因数を決定して表示するプログラムを作りました。必要なコードは次のとおりです。

    Scanner input = new Scanner(System.in);

    System.out.print("Enter integer: ");
    long num = input.nextLong();

    for(long i = 1; i <= Math.sqrt(num); i++) {
        if(num % i == 0) {
            System.out.println(i);
            if(i != num/i) {
                System.out.println(num/i);
            }
        }
    }

与えられた数の因子を見つけるためにこのプログラムが必要なだけです。ただし、さらに一歩進んで係数を表示する場合昇順必要なコードは次のとおりです。

    Scanner input = new Scanner(System.in);

    System.out.print("Enter integer: ");
    long num = input.nextLong();

    ArrayList<Long> list1 = new ArrayList<>(), list2 = new ArrayList<>();

    long currentTime = System.currentTimeMillis();

    for(long i = 1; i <= Math.sqrt(num); i++) {
        if(num % i == 0) {
            list1.add(i);
            if(i != num/i) {
                list2.add(num/i);
            }
        }
    }

    int n1 = list1.size() - 1;
    int n2 = list2.size() - 1;

    for(int i = 0; i <= n1; i++) {
        System.out.println(list1.get(i));
    }

    for(int i = n2; i >= 0; i--) {
        System.out.println(list2.get(i));
    }

これは何をしますか:このプログラムは、あるリスト(list1)に数値の平方根までの数値の因数を格納し、別のリスト(list2)にこれらの数値の逆を格納します。次に、両方のリストの要素を出力します(図を参照)。

3
Jainil Ajmera

forループに問題はありませんが、ここで使用するのはwhileループは間違っています。 forループのロジックは次のとおりです。

  • ffを1に設定します。
  • ff <= fの間続けてください。
  • forループですべてを実行したら、ffに1を追加します。

これはあなたが望む通りのように見えます。

ただし、whileループは正しくありません。 fffの因数である限り、そこに記述したコードはすべて実行され続けるため、whileコードで変更しない限り、次のようになります。無限ループ。ただし、これをifステートメントに変更すると、必要なものが得られます。

因子をチェックしているので、実際にはfまでのすべての可能性をチェックする必要はありません-fの平方根までだけです。 ffが因数であることがわかった場合は常に、ffが平方数でない限り、ff/ffの両方を因数として出力します。

2
DenverCoder8

Java 8で導入されたストリームを利用して、以下は指定された数の因数を出力します。

int input = 1500;
IntStream.rangeClosed(1, input)
         .filter(e -> input % e == 0)
         .forEach(System.out::println);
0
Michael B

これはあなたが上司のようにそれを自分で書く方法です。 1つと2つを処理するためにifステートメントを追加する必要がありますが、それ以外に;この方法はそれが得るのと同じくらいセクシーです

  public static void primerize(int n){
  boolean reduced = false;
  while(n > 2){
     if(n%2 == 0){
        System.out.println(2 + "," + n/2);
        n /= 2;
     }
     else{
        int i = isPrime(n); 
        if(i == n && reduced == false){
           System.out.println(1 + "," + n);
           n /= n;
        }
        else if(i == n){
           n/= n;
        }
        else{
           System.out.println(i + "," + n/i);
           n = i;
           reduced = true;
        }
     }
  }}



public static int isPrime(int n){
  for(int i = (n/3); i > 0; i--){
     if(i == 1){
        return n;
     }
     else if(n%i == 0){
        return i;
     }
  }
  return 0;}
0
jacobr

わずかに変更された解決策:最初に、変数xが変数yで割り切れるかどうかを確認できます。はいの場合、1を数え、このプロセスを繰り返します。ループカウンターの場合、x/yが使用され、xがゼロになったがループがまだ終了していない場合の繰り返しを避けるためにx> 0をチェックする必要があります。

   public class Factor {

    public static void main(String[] args) {

        int x = 48;
        int x1 = x;
        int y = 2;
        int k = x / y;
        int j = 0;
        for (int i = 1; i < k; i++) {
            if ((x % y) == 0 && x > 0)
                j++;
            x = x / 2;
        }
        System.out.println(+x1 + " is a factor of " + y + " for " + j
                + " times.");

    }
}
0
Tarek

私はこれですべての要素をうまく取得しました(質問のアルゴリズムを変更しただけです)。

int num1 = 120;

for(int num2=1;num2<=num1;num2++)
{
  if (num1%num2 != 0)
    System.out.println(num2);
}
0
Bry N.
public static void printFactors(int number) {
    if (number < 1 )
        System.out.println("Invalid Value");

    for (int i = 1 ; i <= number ; ++i) {
        if ( number % i == 0)
                System.out.println(i);
        }
    }
}
0
Artur Grabowski
    import Java.util.Scanner;
    public class Factors 
    {
        Scanner scn=new Scanner(System.in);
        int num=scn.nextInt();
        public void findFactor()
        {
           System.out.println("Factors are");
           System.out.println("1");
           for(int i=2;i<=num;i++)
           {
                if(num%i==0)
                {
                    num=num/i;
                    System.out.println(i);
                    i=2;
                }
           }
        }
public static void main(String[] args) 
{
    while(1==1)
    {
        System.out.println("Enter a Number");
        Factors fct=new Factors();
        fct.findFactor();
    }
}

}

Whileループでfまたはffのいずれかを使用して何かを行うつもりはないようですか?もしそうなら、式f%ff != 0はfalse(forループの次のループに移動します)またはtrueのいずれかであり、最終的に無限ループになります。

このような時間が必要ですか?

0
Nanne