12

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

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

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

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

4

14 に答える 14

16

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

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;
}

この回答は、次の2 つの点でSharad Dargan の回答を改善します。

  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));
}
于 2017-08-21T03:55:06.797 に答える
11
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;
    }
}

上記のソリューションは、単純に素因数を計算するように機能します。違いは、製品の他の部分、つまりreqd数を計算し続ける素因数ごとです。

于 2016-02-22T18:06:43.650 に答える
11

指定された数のすべての因数を取得する方法を次に示します。

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
 -----
于 2015-12-02T05:40:45.400 に答える
2

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

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

これはまさにあなたが望んでいるように見えます。

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

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

于 2011-12-27T21:34:30.733 に答える
1
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);
        }
    }
}
于 2019-07-04T07:19:19.673 に答える
0

fどちらかまたはffwhileループで何かをするつもりはないようです? その場合、式f%ff != 0は false であるか (for ループの次の処理に進みます)、または true であり、無限ループに陥ります。

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

于 2011-12-27T16:52:40.200 に答える
0

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

int num1 = 120;

for(int num2=1;num2<=num1;num2++)
{
  if (num1%num2 != 0)
    System.out.println(num2);
}
于 2015-10-09T00:44:06.567 に答える
-1

このコードは、要因を提供します。

ArrayList<Integer> arr = new ArrayList<>();
        int x=48;
        int y=1;
        while(x!=1)
        {
            if(x%y==0)
            {
                x=x/y;
                arr.add(y);
                if(y==1)
                {
                    y++;
                }
            }
            else
            {
                y+=1;
            }
        }
        System.out.println(arr);
于 2014-10-30T21:29:08.447 に答える
-4

再帰関数を使用する最も簡単な方法

public static int factorial(int n){
        if(n!=1)
            return n*factorial(n-1);
        return 1; 
}   
于 2016-04-30T14:46:05.327 に答える