wseng Ответов: 2

Как найти простые множители целого числа


Напишите программу, которая считывает целое число и отображает его наименьшие простые множители в порядке возрастания. Например, если вход равен 60, то выход должен быть 2,3,5...
Я вышел с нижеприведенным кодом, но я получаю 2 2 3 5.Как иметь только один 2 ?

Что я уже пробовал:

package chapter4;

import java.util.Scanner;

public class Exercise4_16 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("Enter an integer: ");
		Exercise4_16 exe = new Exercise4_16();
		int value = input.nextInt();
		exe.primeFactors(value);
	}

	public void primeFactors(int value) {
		while (value % 2 == 0) {
			System.out.print(2 + " ");
			value = value / 2;
		}

		for (int i = 3; i <= Math.sqrt(value); i = i + 2) {
			while (value % i == 0) {
				System.out.print(i + " ");
				value /= i;
			}
		}

		if (value >= 2) {
			System.out.print(value);
		}
	}
}

2 Ответов

Рейтинг:
9

Patrice T

Цитата:
Например, если вход равен 60, то выход должен быть 2,3,5...
Я вышел с нижеприведенным кодом, но я получаю 2 2 3 5.Как иметь только один 2 ?

Наверное потому что 60=2*2*3*5
Можно догадаться, что 27 дадут 3*3*3 ДОУ по той же причине.

Вам нужно изменить свой код, чтобы вывести коэффициент один раз, независимо от того, сколько раз он находится в целочисленном числе. Вам нужно разделить печать фактора и редукцию на целое число.


wseng

Как я могу напечатать фактор один раз?

Рейтинг:
14

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
exe.primeFactors(value);

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!