web-dev-qa-db-ja.com

Java数値の素因数分解を表示する

したがって、私の割り当てでは、ユーザーに整数入力を要求するプログラムを作成してから、その数の素因数分解を出力する必要があります。これは私が持っているものです:

import Java.util.Scanner;

public class PrimeFactor {
    public static void main(String[] args) {
        System.out.print("Enter a positive number: ");
        Scanner scanner = new Scanner (System.in);
        int number = scanner.nextInt();
        int count;
        for (int i = 2; i<=(number); i++) {
            count = 0;
            while (number % i == 0) {
                number /= i;
                count++;
                if (count == 0) {
                    continue;
                }
            }
            System.out.println(i+ "**" + count);
        }
    }
}

私が今抱えている問題は、15453のように実行すると、素因数だけが必要なときに1から100までのすべての因数とその指数のリストが表示され、その方法に固執することです。続行します。

7
RikYC

もうすぐです! _if-continue_ブロックをforループの外に移動します。それ以外の場合は、意図したループではなく、最も内側のループを「継続」します。

_while (number % i == 0) {
    number /= i;
    count++;
}
if (count == 0) {
    continue;
}
System.out.println(i+ "**" + count);
_

または、_System.out.println_呼び出しをif (count != 0)で囲むこともできます。これは、continueに続く唯一のステートメントだからです。

_while (number % i == 0) {
    number /= i;
    count++;
}
if (count != 0) {
    System.out.println(i+ "**" + count);
}
_

Ideoneのプログラム: リンク

4
dasblinkenlight
public class _03_LargestPrimeFactor {

public static void main(String[] args) {

    long a = 600851475143L;

    for(int i=2; i<(a/i); i++){                         // no factors would exist beyond a/i for a particular i

        while( a%i == 0){                               // if i is a factor 
            a = a/i;                                    // divide a by i else we wont get a prime number
            System.out.print(a + " x " + i + "\n");
        }
    }

    if(a > 1)
    System.out.println("largest prime factor: " + a);
}

}

コンソール:

8462696833 x 71

10086647 x 839

6857 x 1471

最大の素因数:6857

1
user3003976

乗算を2回印刷する理由がわかりません!クリーンアップされたコードは次のとおりです。

public static void printPrimeNumbers(int prime) {

    int n;

    for (int i = 2; i <= prime; i++) {
        n = 0;
        while (prime % i == 0) {
            prime /= i;
            n++;

        }

        if (n != 0) {
            for (int j = n; j > 0; j--) {
                System.out.print(i);

                if (prime != 1) {
                    System.out.print("*");
                }
            }
        }
    }
}
0
samsina

一つには、あなたのcontinueはwhileループの中にあり、何の効果もありません。最小限の修正は

public class PrimeFactor {
    public static void main(String[] args) {
        System.out.print("Enter a positive number: ");
        Scanner scanner = new Scanner (System.in);
        int number = scanner.nextInt();
        int count;
        for (int i = 2; i<=(number); i++) {
            count = 0;
            while (number % i == 0) {
                number /= i;
                count++;
            }
            if (count == 0) {
                 continue;
            }
            System.out.println(i+ "**" + count);
        }
    }
}

しかし、他にもいくつか問題があります。

  • コードが適切に「ファクタリング」されていない(皮肉なことに、このコンテキストで「ファクタリング」されているということは、関数に分割されていないことを意味します
  • 変数名の選択が不十分
  • continueで十分な場合は、goto(この場合はif)を使用します

より良いコードは

public class PrimeFactor {
    public static void main(String[] args) {
        System.out.print("Enter a positive number: ");
        Scanner scanner = new Scanner (System.in);
        printFactors(scanner.nextInt());
    }
    public static void printFactors(int product) {
        for (int factor = 2; factor <= product; factor++) {
            int exponent = 0;
            while (product % factor == 0) {
                product /= factor;
                exponent++;
            }
            if (exponent > 0) {
                System.out.println(factor+ "**" + exponent);
            }
        }
    }
}
0
Malvolio

if(count == 0){continue;}ステートメントをwhileループから削除し、その後、forループに配置します。 :)

for (int i = 2; i<=(number); i++) {
        count = 0;
        while (number % i == 0) {
            number /= i;
            count++;
        }
        if(count==0) continue;
        System.out.println(i+ "**" + count);
    }
0
user2942648

あなたは近いです:

  1. System.out.printlnステートメントはforループ内にあり、_count>0_に対してのみ表示される必要があります
  2. if(count == 0) { continue; }を削除します。countをインクリメントしただけなので、役に立ちません。
0
mprivat

以下の関数からもいくつかの助けを得ることができます。

public int getPrimeNumber(double number) {
    int j = 0;
    while (number % 2 == 0) {
        number = number / 2;
        j = 2;
    }

    for (int i = 3; i <= number; i = i + 2) {
        while (number % i == 0) {
            number = number / i;
            j = i;
        }
    }

    return j == 0 ? 1 : j;
}

この関数は、指定された数の最大の素因数を返します。

0
pradeep