rozbicie i sumowanie liczb ujemnych - prośba o pomoc

0

Witam,
Mam problem z zadaniem ze swojego szkolenia, a na chwilę obecną mój instruktor jest nieosiągalny.
Mianowicie mam za zadanie stworzyć program, który :

  1. Szczytuje z konsoli wprowadzone liczby typu int.
  2. Program rozbija liczby int na poszczególne cyfry i na koniec podaje ich sumy.

Z pierwszym poleceniem się uporałem, natomiast w drugim mam problem z sytuacją gdzie wpisuję w konsole liczby ujemne, a przecież int to także takie liczby. Poniżej wklejam swój kod:

import java.util.Scanner;

public class SumDigitsInNumber {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("Please, enter integer: ");
		int number = sc.nextInt();
		
		int sumOfDigits = sumDigitsInNumber(number);
		System.out.println(sumOfDigits);
	}

	public static int sumDigitsInNumber(int number) {
		String strValue = String.valueOf(number);
		int sum = 0;
		int charValue = strValue.length();
			for(int i = 0; i < charValue; i++) {
				char ch = strValue.charAt(i);
				int value = Character.getNumericValue(ch);
				sum += value;
			}
		return sum;
	}
}

W metodzie najpierw przerobiłem wartość na typ String, następnie pobrałem wartość liczbową za pomocą valueOf(), określiłem długość Stringa i zastosowałem pętle for, która bada znak po znaku mojego Stringa i sumuje jego wartość liczbową.
Niestety nie mam bladego pojęcia jak wykonać pętle, tak aby uwzględniała znaki ujemne i pierwszą liczbę za minusem traktowała jako liczbę ujemną. Na daną chwilę program z liczby np. -77 daje wynik 13, a powinien dawać 0. wydaje mi się, że ten minus traktowany jest jako -1, czyli pętla zamienia mi po prostu jeden znak "-" na dwa dodatkowe "-1".
Ma ktoś pomysł, jak poprawić mój kod, tak aby działał poprawnie?
Teoretycznie Eclipse nie wykazuje żadnego błędu, ale program nie działa prawidłowo...

3
            for(int i = 0; i < charValue; i++) {
                char ch = strValue.charAt(i);
                if(ch !='-'){
                    int value = Character.getNumericValue(ch);
                    sum += value;
                }
            }

i cyk, 15k wpada do kabzy

0

@Shalom: Dzięki bardzo za pomoc, program przeszedł sprawdzenie :) Chyba jednak nie do końca zrozumiałem zadanie, bo w tej chwili program po prostu ignoruje znak minus i np. z liczby -77 sumę daje 14, a ja zrozumiałem, że ma dawać 0 -> ((-7) + 7). Ehhh.. chyba za bardzo przekombinowałem :)

0

-7 nie jest cyfrą ;)

1

System.out.print("Please, enter integer: ");

więc -3-4-12 to nie będzie poprawnie zapisana liczba

Hint: system dziesiętny, pozycje przy k to 10^k: 10^0, 10^1, 10^2 itd
Dzielenie przez 10^k (k=0, 1, 2, 3...) daje kolejne interesujące cię wartości

Propozycja

kod

package pl.bv.p86;

public class TotalCalculator {

    public static long total(String numberTxt) {

        long parsedNumber = Long.parseLong(numberTxt);
        int signum = Math.round(Math.signum(parsedNumber));
        long number = Math.abs(parsedNumber);
        long total = 0L;

        while (number > 0) {
            total += number % 10;
            number /= 10;
        }

        return signum * total;
    }
}

test

package pl.bv.p86;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Collection;
import java.util.List;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

@RunWith(Parameterized.class)
public class TotalCalculatorTest {

    @Parameterized.Parameter(value = 0)
    public String inputTxt;
    @Parameterized.Parameter(value = 1)
    public long expectedTotal;

    @Parameterized.Parameters
    public static Collection<Object[]> data() {

        return List.of(new Object[][]{
                {"0", 0L},
                {"1", 1L},
                {"-1", -1L},
                {"2", 2L},
                {"-2", -2L},
                {"10", 1L},
                {"-10", -1L},
                {"20", 2L},
                {"-20", -2L},
                {"11", 2L},
                {"-11", -2L},
                {"100", 1L},
                {"-100", -1L},
                {"12", 3L},
                {"-12", -3L},
                {"102", 3L},
                {"-102", -3L},
                {"123456789", 45L},
                {"-123456789", -45L},
                {"1234567890", 45L},
                {"-1234567890", -45L},
                {"12345678900", 45L},
                {"-12345678900", -45L},
                {"10234567890", 45L},
                {"-10234567890", -45L},
                {"1002345678900", 45L},
                {"-1002345678900", -45L},
                {"12345678910", 46L},
                {"-12345678910", -46L}
        });
    }

    @Test
    public void shouldCalculateTotal() {

        // given
        // when
        long total = TotalCalculator.total(inputTxt);
        String msg = String.format("%s expected to give %d but gave %d", inputTxt, expectedTotal, total);

        // then
        assertThat(msg, total, is(expectedTotal));
    }
}
0

@BraVolt: Faktycznie, też to rozwiązanie przechodzi w systemie, ale nie za bardzo jest ono dla mnie zrozumiałe i pierwsze na co wpadłem to rozbicie na Stringa. Ale dzięki za podpowiedź, przyjrzę się temu dokładniej wieczorem, zawsze to coś nowego i dodatkowa wiedza DZIĘKI :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1