Как умножить все цифры int без преобразования их в строку, а затем использовать функцию charAt с циклом for?

в основном, я хочу попробовать средство для сохранения постоянства, и я новичок в кодировании Java, поэтому я все еще использую графический интерфейс NetBeans для кодирования (я знаю), но мне нужна помощь, чтобы заставить его работать. Приложил мои усилия ниже. Графический интерфейс — это просто текстовое поле, которое принимает ввод, и кнопка с заданным кодом. Если бы кто-то мог помочь, это было бы здорово. Заранее спасибо.

Ошибка, которую я продолжал получать, была: Исключение в потоке "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 4 (4 — длина числа, которое я ввел. Соответственно оно менялось)

Графический интерфейс

long num1=Long.parseLong(jTextField1.getText());
String num2=jTextField1.getText();
char s1;
int pers=1,temp;
for(int i=1;i<=num2.length();i++)
{
  s1=num2.charAt(i);
  temp=Character.getNumericValue(s1);
  pers*=temp;
  if (pers==0)
   {
    System.out.println(i);
    break;
   }
}


String num2=jTextField1.getText();
String test=num2;
char s1;
int pers=num2.length(),temp=1,i,n=0;
  do
  {
      for(i=0;i<pers;i++)
   {
    s1=test.charAt(i);
    temp=temp*(Character.getNumericValue(s1));
   }
    test=Integer.toString(temp);
    temp=1;
  } while(test.length()>1);
  System.out.println(n);

  Final working code:
  long r1=Long.parseLong(jTextField1.getText());
  String s=jTextField1.getText(),s1 = "";
  long r=1;
  int i=0;
  char[] gfg=s.toCharArray();
  do
   {
    for (char ch : gfg) 
     {
      r *= Character.digit(ch, 10);
     }
      s1=Long.toString(r);
      gfg=s1.toCharArray();
      System.out.println(r);
      r=1;
   }while(s1.length()!=1);

Строки в Java идут от 0 до длины-1, а не от 1 до длины.

markspace 07.04.2019 02:15

Я знаю, что все говорят, что от 0 до <длины, но я ввел от 1 до <= длины, разве это не означает, что цикл повторяется столько же раз, сколько от 0 до <длины?

Amaan Shaikh 07.04.2019 02:28

Компьютеры считают с 0. Таким образом, вызов String.charAt(0) вызывает первый символ строки. Вызов array[0] вызывает первый индекс массива. Ваш IndexOutOfBoundsException можно легко остановить, заменив for(int i=1; i<=num2.length(); i++){ на for(int i=0; i<num2.length(); i++){

FailingCoder 07.04.2019 02:31

Ну ладно я помню, что сейчас внесу соответствующие изменения. Спасибо

Amaan Shaikh 07.04.2019 02:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш ввод уже является String, преобразуйте его в char[] и используйте цикл for-each. Нравиться,

int r = 1;
for (char ch : jTextField1.getText().toCharArray()) {
    r *= Character.digit(ch, 10);
}

В качестве альтернативы допустимы индексы от 0 (включительно) до length (исключительно). Итак, ваша петля for должна выглядеть так:

int i=1;i<=num2.length();i++

должно быть

int i=0; i < num2.length(); i++

Основываясь на вашем комментарии ниже, что вам нужно сделать это дважды, я бы извлек логику в метод и дважды вызвал его. Нравиться,

private static int multiplyDigits(int r) {
    int t = 1;
    while (r > 0) {
        t *= r % 10;
        r /= 10;
    }
    return t;
}

А потом

String str = "4544";
System.out.println(multiplyDigits(multiplyDigits(Integer.parseInt(str))));

можете ли вы подробно объяснить, для чего нужны начальные строки кода? Я ввел их в графический интерфейс и ввел 4544 в jTextField1, а r было 320. Я не понимаю...

Amaan Shaikh 07.04.2019 02:26

Но 4*5*4*4 — это 320. Чего ты ожидал?

Elliott Frisch 07.04.2019 02:33

Я думаю, он хотел объяснений..? Я не знаю лично.

FailingCoder 07.04.2019 02:35

Но затем мне нужно, сколько раз требуется, чтобы умножение достигло 0. Итак, я снова помещаю это в цикл и использую другую переменную для подсчета количества раз?

Amaan Shaikh 07.04.2019 02:36

@FallingCoder да, объяснение было бы хорошим, но я все равно его понял. Спасибо. Хотя другой вопрос, который я задал, все еще беспокоит меня. Нужно ли мне помещать этот цикл for в другой?

Amaan Shaikh 07.04.2019 02:37

@AmaanShaikh Нет. Зачем вам нужен вложенный цикл?

Elliott Frisch 07.04.2019 03:13

@ElliottFrisch вложенный цикл, потому что 4 * 5 * 4 * 4 дает мне 320, но это не то, что мне нужно .... Мне нужен вывод как 2, потому что 4 * 5 * 4 * 4 = 320, тогда 3 * 2 * 0 = 0 так 2 шага

Amaan Shaikh 07.04.2019 03:50

@ElliottFrisch, ваш отредактированный метод работает, но только если я знаю, сколько раз функция должна повторяться.

Amaan Shaikh 07.04.2019 15:08

@AmaanShaikh В следующий раз, когда вы зададите вопрос, пожалуйста включите все актуально подробности в вопроса.

Elliott Frisch 07.04.2019 16:27

Мне жаль. Честно говоря, я не могу найти ошибку в последнем коде, и я точно не знаю, почему. Ваш метод работает, но недостаточно :\

Amaan Shaikh 08.04.2019 01:11

@ElliottFrisch, ваш код сработал ... хотя мне пришлось его сильно подправить .... Я добавлю его в вопрос, чтобы вы могли посмотреть на шедевр, который вы помогли создать. Хотя я, конечно, не игнорирую помощь и предложения FallingCoder. Большое спасибо вам обоим. Ваше здоровье

Amaan Shaikh 10.04.2019 01:28
Ответ принят как подходящий

Простой способ исправить данную ошибку прост.

Компьютеры считают с 0. Таким образом, вызов String.charAt(0) вызывает первый символ строки. Вызов array[0] вызывает первый индекс массива. Вызов String.charAt(1) или array[1] вызывает элемент второй.

Ваше исключение IndexOutOfBoundsException можно легко остановить, изменив

for(int i=1; i<=num2.length(); i++){ к for(int i=0; i<num2.length(); i++){


Причина, по которой ваш код выдает ошибку:

Когда цикл начинается, ваш код пропускает первый символ.

В последней итерации цикла for, где i == num2.length() вызывает проблему, потому что вы пытаетесь вызвать несуществующий символ Н+1th строки, в то время как длина составляет всего Н.


Причина, по которой ваш отредактированный код вызывает ошибку, заключается в том, что в строке test=Integer.toString(temp); вы делаете test меньшим числом. (Наверное)

Допустим, num2 было 989. Test = num2 и pers = num2.length(), which is 3 Это важно.

После этой строки test=Integer.toString(temp); тест становится 9. (как строка)

Помните, что test — это всего лишь одна length 1 цифра? Что ж, в следующей итерации цикла do while внутри цикла for i to pers равно 0 to 3. Однако, опять же, test — это всего лишь одна цифра, длина которой равна 1.

В цикле for попробуйте добавить System.out.println(test.charAt(i)).


Самая важная часть кода — это логика, стоящая за ним. Если вы потеряли код, который вы набрали, но сохранили план его создания, вы можете снова сфабриковать код. Если вы забудете логику, лежащую в основе кода, и ваш учитель попросит вас объяснить ее, вы начнете с нуля.

Логика вашего кода (как описано в заголовке) для умножения каждой цифры в числе такова.

Введите String

Make COUNT integer, equal to 1
Loop: (Use String like char[] array)
    Call String.charAt(int)
    Parse String.charAt(int)
    COUNT (<<placeholder name) *= parsed integer (valueOf returns the Integer wrapper class, you used int instead)
End loop
Print result

Разница между parseInt и valueOf в java?

да. Это верно. Проанализируйте мое «исправление» вашего кода.

FailingCoder 07.04.2019 02:42

В общем, я последовал совету как от @FallingCoder, так и от Эллиотта, и я сделал две отдельные кнопки, содержащие каждый из ваших кодов, и без обид, Эллиотт, но ваш не мог обрабатывать большие числа, в то время как от 0 до <length работал: P Спасибо вам обоим. Кроме того, как новый пользователь, я был удивлен тем, как быстро пришли ответы. Продолжайте в том же духе, ребята. :)

Amaan Shaikh 07.04.2019 02:51

Хотя может показаться, что для получения просмотров вашего вопроса потребуется не менее часа, на самом деле это займет всего около 5 секунд или около того.

FailingCoder 07.04.2019 02:52

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

Amaan Shaikh 07.04.2019 03:47

Строка num2=jTextField1.getText(); Проверка строки = число2; символ s1; int pers=num2.length(),temp=1,i,n=0; do { for(i=0;i<pers;i++) { s1=test.charAt(i); temp=temp*(Character.getNumericValue(s1)); } test=Integer.toString(temp); темп=1; } пока(test.length()>1); Система.out.println(n);

Amaan Shaikh 07.04.2019 03:47

подожди, я вставлю это в вопрос

Amaan Shaikh 07.04.2019 03:47

@FallingCoder Я добавил новый фрагмент внизу вопроса. Пожалуйста помоги.

Amaan Shaikh 07.04.2019 03:51

В чем проблема?

FailingCoder 07.04.2019 03:56

@FallingCoder та же ошибка, что и раньше. Постоянство работает для чисел, содержащих ноль, и дает результат как 1, но для любого другого числа, например 235, вместо того, чтобы давать 2, он просто снова выдает эту ошибку Исключение в потоке «AWT-EventQueue-0» java.lang.StringIndexOutOfBoundsException: Индекс строки вне допустимого диапазона: 2

Amaan Shaikh 07.04.2019 04:02

В вашем коде test.length() никогда не меняется. Однако мне не удалось найти источник ошибки.

FailingCoder 07.04.2019 04:33

@FallingCoder, но тест меняется на temp правильно, так что я думаю, меняется длина

Amaan Shaikh 07.04.2019 05:40

Я понял теперь. Я не понимаю, почему вы изменили test, чтобы фактически быть одним персонажем. Источник проблемы кроется в том, что pers не меняет с участиемtest. В результате, когда вы вызываете test.charAt(Anything above 0), создается исключение IndexOutOfBounds. Почему? Поскольку test изменился на один символ, и вы вызываете test.charAt(pers), где pers, вероятно, больше 0. Поскольку test.charAt(0) является первым символом, а test.charAt(>0) вызывает несуществующие символы, это вызывает эту ошибку. (Эта строка меняет его: test=Integer.toString(temp);)

FailingCoder 07.04.2019 05:51

@FallingCoder подождите, почему люди должны постоянно меняться? pers используется только в цикле for и больше нигде. Кроме того, в моем коде это test.charAt(i), и если я прав, я иду от 0 к длине, как вы упоминали ранее. Итак, я не вижу, где закрадывается ошибка outofbounds...

Amaan Shaikh 07.04.2019 15:11

Допустим, num2 равно «12». pers тогда будет 2. Вы входите в цикл do-while, а затем в цикл for. s1 = temp.charAt(i). Это не выдает ошибку, потому что i=0 и test равно "12". s1 = '1'. temp *= 1. Следующая итерация цикла for: temp *= 2. Ошибок пока нет. После цикла for вы вызываете test=Integer.toString(temp); который изменяет test на один символ., поэтому test будет 1. (Строка) Поскольку pers равно 2, а test.length() будет 1, вызов s1=test.charAt(i); вызовет ошибку. В частности, StringIndexOutOfBoundsException.

FailingCoder 07.04.2019 17:46

Думать. Я дал вам полное объяснение. Если вы не можете этого сделать, то я поверю, что вы скопировали половину этого из Интернета.

FailingCoder 07.04.2019 21:02

Я не слышал, но я знаю, что это может звучать так. Хотя ваше объяснение имеет смысл, я действительно не понимаю ту часть, где вы объясняете, почему вторая итерация вызывает ошибку StringIndexOutOfBoundsException. Кроме того, я не могу выразить это достаточно, но я действительно благодарен вам за терпение со мной. Я все еще манекен, так что спасибо. :)

Amaan Shaikh 07.04.2019 23:24

Я полностью переписал свое объяснение и поместил его в свой ответ. Больше переписывать не буду, да и редактировать не хочу.

FailingCoder 08.04.2019 01:13

@FallingCoder Я попробую ввести i<test.length() вместо pers и посмотреть, сработает ли это. Спасибо :)

Amaan Shaikh 09.04.2019 01:33

посмотрите на окончательный рабочий код, который я добавил в вопрос

Amaan Shaikh 10.04.2019 01:29

Зачем нужен цикл do-while?

FailingCoder 10.04.2019 01:49

Другие вопросы по теме