私はこのようなものを持っています:
int f = 120;
for(int ff = 1; ff <= f; ff++){
while (f % ff != 0){
}
要因を見つけるためのループに何か問題がありますか? for ステートメントと while ステートメントの仕組みについては本当に混乱しているので、完全に間違っている可能性があります。
この後、上記の要因に変数を割り当てるにはどうすればよいですか?
私はこのようなものを持っています:
int f = 120;
for(int ff = 1; ff <= f; ff++){
while (f % ff != 0){
}
要因を見つけるためのループに何か問題がありますか? for ステートメントと while ステートメントの仕組みについては本当に混乱しているので、完全に間違っている可能性があります。
この後、上記の要因に変数を割り当てるにはどうすればよいですか?
次のコードは、指定された数値のすべての因数のリストを返します。
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 の回答を改善します。
この回答で使用されているアイデアに基づいて、数値が偶数か奇数かに基づいて増分する値を決定することで、ソリューションを高速化できます。
for ループの前に次のコード行を追加します。
int incrementer = num % 2 == 0 ? 1 : 2;
次に、ループの最後の部分を次のように変更します。
i += incrementer
数値が奇数の場合、常に 1 ずつインクリメントするのではなく、すべての偶数をスキップします。
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));
}
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数を計算し続ける素因数ごとです。
指定された数のすべての因数を取得する方法を次に示します。
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
-----
for
ループに問題はありませんが、while
ここでループを使用するのは間違っています。for
ループのロジックは次のとおりです。
ff
します。ff <= f
。for
、 に 1 を追加しff
ます。これはまさにあなたが望んでいるように見えます。
ただし、while
ループは正しくありません。ff
が因数である限り、そこに記述したコードは何でも実行し続けるためf
、コードでそれらを変更しない限りwhile
、無限ループが発生します。ただし、それをif
ステートメントに変更すると、必要なものが得られます。
因数をチェックしているので、実際には f までのすべての可能性をチェックする必要はなく、f の平方根までしかチェックできません。が因数であることがわかったら、 が平方数でない限り、と の両方をff
因数として出力します。ff
f/ff
f
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);
}
}
}
f
どちらかまたはff
whileループで何かをするつもりはないようです? その場合、式f%ff != 0
は false であるか (for ループの次の処理に進みます)、または true であり、無限ループに陥ります。
このような時間が本当に必要ですか?
これですべての要素がうまくいきました(質問のアルゴリズムを変更しただけです)。
int num1 = 120;
for(int num2=1;num2<=num1;num2++)
{
if (num1%num2 != 0)
System.out.println(num2);
}
このコードは、要因を提供します。
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);
再帰関数を使用する最も簡単な方法
public static int factorial(int n){
if(n!=1)
return n*factorial(n-1);
return 1;
}