Crooked Digits

Hey, написах този код и не мога да разбера защо не мога да parse-na този string n към int :

import java.util.Scanner;

public class Crooked_digits {
public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    String n = input.nextLine();
   n= n.replace("-", "");
   n = n.replace(".", "");

int sum = 0;
int j = 0;
int f = 0;
int sum2 = 0;
int x = Integer.parseInt(n);

  while(x > 0)
    {
        j = x % 10;
        sum = sum + j;
        x = x / 10;
    }


     if (sum < 10){

         System.out.println(sum);
     }
        else

      while (sum > 9){

          f = sum % 10;
          sum2 = sum2 + f;
          sum = sum/ 10;
          System.out.println(sum2);
      } }}

Здрасти, погледна ли това

The number N will have no more than 300 digits before and after the decimal point

, малко трудно ще се събере в Integer :slight_smile:

1 Like

Thanks! , с long се parse-na правилно, но пък в код след това явно също имам грешка, защото отговорите не излизат :thinking:

Не излизат, защото целта не е да го парснеш към число, а да го разглеждаш като стринг.

1 Like

Отново файл-на кода , този път с 60/100 точки. Погледнах editorial-a и мисля, че теоретично правя (очевидно не обаче)

import java.util.Scanner;
public class Crooked_digits {
public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    String n = input.nextLine();
    n = n.replace("-", "");
    n = n.replace(".", "");

    int sum = 0;
    int sum2 = 0;
    int sum3 = 0;
    int y = 0;

    int i;
    for (i = 0; i < n.length(); i++) {

        char x = n.charAt(i);
        sum = sum + Integer.parseInt(String.valueOf(x));

    }

    if (sum < 10) {

        System.out.println(sum);
    } else if (sum > 9) {

        while (sum > 9) {

            y = sum % 10;
            sum2 = sum2 + y;
            sum = sum / 10;
        }

        if (sum2 + sum < 10) {
            System.out.println(sum2 + sum);

        } else if (sum2 + sum > 10 ) {

            sum3 = sum2 % 10 + sum2 / 10;
        System.out.println(sum3);

        }
    }
}

}

Прочети си хубаво условието. Подсказвам задачата се решава с while.

Здравейте,

Опитвам се да реша задачата на JS, но при тестване в Judge, ми излизат само 4/10 верни. При примерните тестове от задачата всичко е наред. Това което не мога да разбере е, че при вложните цикли, ако ми се получи 10, спира цикъла, а не го завърта още веднъж. Някакви идеи? Ето го и кода: Click

Благодаря

Здравей Колега,

Съветвам те да имаш само едно място на което принтираш output.

Веднага след фор-цикъла имаш команда print(output), още преди проверка _if ( output > 9) _ , което при резултат по голям от 9 ще принтира и след това ще влезне в проверката.

Помисли за втората част, какво ще стане ако влезнеш например output = 999?

Променливата newN реално ще добави три пъти 9, output вече ще е равен на 0 и while приключва, след което output = newN(9+9+9 = 27) и принтираме 27.

Приложено ти изпращам два варианта за решение на задачата, моя съвет е да разгледаш второто решение:

  1. https://pastebin.com/HWMgrGLX

  2. https://pastebin.com/xDNnxVYz

Поздрави,

Мишо

Здравейте,
Опитвах се по всякакъв начин да наместя BigInteger, но в моето решение n трябва да е int заради while. Ще съм благодарна на съвет и насока :wink: Ето го и сегашният ми код.

https://pastebin.com/R7Lp8jmL

Здравей,

Мислиш ли, че може да превърнеш този стринг в масив от числа и да сравняваш по този начин?

Т.е. всяка отделна цифра да ти е в отделна клетка на един масив? След това проверките са сравнително лесни.

Добра работа с replace методите. :slight_smile:

Давам ти моето решение - https://pastebin.com/21J9rm4n

Оставам на линия за въпроси.

2 Likes

Благодаря, Теди!
Страхотевично и елегантно решение е твоето веднага го назубрих ))

Благодаря и чудна вечер от мен!
ПС ще имам въпроси, но по другите задачи :wink:

Здравейте,

Ето го и моят код : https://pastebin.com/9p8kYnPp

Дава ми грешка при третия input : 1020340567.89

Ще се радвам, ако някой удари едно рамо и подскаже как да го оправя :slight_smile:

Лек ден!
Поздрави,
Алесандра

Здравей,

Ако пуснеш дебъг на програмата си, ще забележиш как при парсването на дълго число от String към double се добавя знак за експоненциален запис “Е” в самото число, от което после идват всички проблеми.

Конкретно с твоя input от 1020340567.89, се получава следния резултат:

11Capture

Решението тук е да приемеш числото като String, след което да направиш нужните операции.

Edit: сетих се за по-елегантно решение. Преправи това:

if (c != '.')

На това:

if (c != '.' && Character.isDigit(c))

Успех!

Поздрави,
Петър

1 Like

Представих числото като String, премахнах “-” и “.” и след това го превърнах в число. Този път мина, обаче ми даде 30/100.

https://pastebin.com/f4Y9WAUX

Пробвах и другия вариант с if (c != '.' && Character.isDigit(c)) , но пак ми дава 30/100.

Здравей,

Преправих първата половина на кода, като втората можеш да я ползваш както си е:

    Scanner user_input = new Scanner(System.in);
    String input = user_input.nextLine();
    long sum = 0;
    long number = 0;
    for (int i = 0; i < input.length(); i++) {
        if (Character.isDigit(input.charAt(i))) {
            number += input.charAt(i) - '0';
        }
    }
    if (number == 0) {
        System.out.println("0");
    }
    while (number > 0) {
    ..... }

Обърни внимание на методите Character.isDigit и charAt, които ще са ти много полезни за в бъдеще.

При number += input.charAt(i) - '0'; вадим изрично нулата, защото при директно присвояване на char към int, char-a придава своята ASCII стойност, и трябва изрично да извадим тази нула под формата на char (или да извадим int-овата стойност на нула в ASCII, която е 48).

Ако искаме да избегнем горните калкулации, можем да ползваме метода getNumericValue.:

number += Character.getNumericValue(input.charAt(i));

Което ни връща директно числовата (int) стойност на въпросния char и така няма нужда да мислим за ASCII.

Операторите += са съкращение на number = number + …

Миналият подход иначе не проработи, защото не обърнах внимание, че при написване на дълго число, експоненциалният запис “Е” замества цели цифри, и така докато стигнем до нашата проверка, вече имаме изкривен/съкратен запис на първоначално зададените данни.

Поздрави,
Петър

За триене, открих къде ми се дъни кода.

JS:
function crd(d)
{
var nd = d.toString().replace(".", “”).replace("-", “”);
var n = 0;
for(var i = 0; i < nd.length; i++) {
n += parseInt(nd[i]);
}
if(n > 9) {
return crd(n)
}
return n;

}
console.log( crd(3) )

Здравейте,

Мога ли да помоля за малко помощ по същата задача, но с Python.
Ето го кодът, който пиша и на 2 от тестовете минава, след това се чупи.

Поздрави

crdig - Pastebin.com ,този код минава 100/100

Решение със while цикъл : croocked digit - Pastebin.com