2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Java
Сообщение05.03.2007, 23:55 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Всем привет!

Значит у меня возникла сл ситуация. Меня попросили помочь написать программу (она у нас пишется на Java). Суть её в следующем: любое число должно выдавать все свои делители. (вообще-то там даже так:
Код:
18 = 2 * 3 * 3
, т.е. число расскладывается на такой стринг своих делителей). Программу я уже написала, но она почему-то не работает. Хотелось бы услышать мнение людей, которые могут чем-то помочь.

Вот мой код:

Код:
import java.util.Vector;



public class Arithmetic {

  private int number;

  private Vector factors;

  public Arithmetic(int i) {
    number = i;
  }

  public void split() {
    int rest = Math.abs(number);
    for (int i = 2; i <= rest; i++)
      if (rest % i == 0) {
        factors.addElement(new Integer(i));
      }
  }

 
    public void show(){
   
    String output = "";
    output += (number + " = ");
    Integer format;
   
    for( int i = 0; i < factors.size(); i++){
      format = (Integer)factors.elementAt(i);
      output += (format.toString() + " * ");
      } 
    System.out.println(output);
    }
}

public class TestArithmetic {

  public static void main(String[] args) {

    Arithmetic test = new Arithmetic(76);
    test.split();
    test.show();

  }
}

 Профиль  
                  
 
 
Сообщение06.03.2007, 00:02 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
В функции split у Вас не меняется переменная rest. Нужно после того, как найден очередной делитель i, разделить rest на него и хорошо бы еще проверить, не обратился ли он в 1, тогда прервать.

 Профиль  
                  
 
 
Сообщение06.03.2007, 02:40 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Спасибо за ответ. То, что rest не меняется - мне известно. На этом этапе я хотела сделать так, что например на число 76 мне выдаются все делители от 2 до 38, а не все простые делители. Поэтому индекс i делит каждый раз именно 76, а не его частные. После этого все эти числа заносятся в вектор, чьи элементы выдаются в форме стринг. Вот пока примитивная идея. Я ожидаю пока все эти числа, но программа мне их не выдаёт, а выдаёт ошибку. И ошибка эта, что у меня где-то NullPointerException... и именно в splite :(

Добавлено спустя 7 минут 36 секунд:

ок, в общем замечания с благодарностью принимаются, я немного доработала сплит и теперь он выглядит так:

Код:
public void split() {
    int num = Math.abs(number);
    int rest = num;
    for (int i = 2; i <= rest; i++)
      if (rest % i == 0) {
        num = rest/i;
          while(num == 1){ break;}
        factors.addElement(new Integer(i));
      }
  }


Это правда не пододвинуло меня к получению аутпута.

Добавлено спустя 2 часа 15 минут 45 секунд:

В общем я уже почти разобралась. NullPointerException устранила (там было легко), теперь я задам ещё один вопрос, как сделать так, чтобы rest в for-скобке зависел от частного? Т.е. то, что имел ввиду PAV, делим не всё время одно и то-же число, а его частное. Проблема в том, что это частное не видно из-за скобок снаружи алгоритма. Я завтра ещё сама подумаю, но если кто укажет идею, то буду благодарна. Пока у меня такой аутпут, он выдаёт все делители числа, а не только простые.

 Профиль  
                  
 
 
Сообщение06.03.2007, 10:08 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Примерно так:

Код:
    for (int i = 2; i <= rest; i++)
      while (rest % i == 0) {
        factors.addElement(new Integer(i));
        rest /= i;
      }


Обратите внимание, что здесь правильнее использовать не if, а while, тогда будет правильно обработана ситуация, когда число содержит несколько экземпляров одного делителя (а если if, то каждый делитель будет учтен ровно один раз).

 Профиль  
                  
 
 
Сообщение06.03.2007, 14:11 
Заслуженный участник
Аватара пользователя


09/10/05
1142
PAV писал(а):
Обратите внимание, что здесь правильнее использовать не if, а while, тогда будет правильно обработана ситуация, когда число содержит несколько экземпляров одного делителя (а если if, то каждый делитель будет учтен ровно один раз).



Большое спасибо! Это как раз то, что надо. Я уже получала как раз к примеру для 99 два значения 3 и 11, но теперь получается все три значения 3, 3, 11. Честно говоря, не думала, что это зависит от while, думала из-за видимости локальной переменой.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group