Tutaj muszę sprawdzić, czy każda cyfra w numerze, dla zakresu powinna być podzielna o 3, co oznacza, kiedy wpisałem 20 i 40, kod musi weryfikować każdą cyfrę numeru od 20 do 40, a jego powinno wyświetlić 30,33,36,39.

Próbowałem zrobić, to zdobyć ostatnią cyfrę kodu i sprawdzić, czy jest podzielnie, utknąłem na myśli

class Main
{
    public static void main(String[] args) {
        System.out.println("Enter the range for shipment numbers :");
        int n;
        int Duplicate = 0;
        int count = 0;

        Scanner sc = new Scanner(System.in);
        int range1 = sc.nextInt();
        int range2 = sc.nextInt();

        for(int i = range1; i <= range2; i++){
            int num = i;
            int length = String.valueOf(i).length();
            Duplicate = 0;

            for(int j = 1; j <= length; j++)
            {
                n = num % 10;
                num = num / 10;

                if(n % 3 == 0 && i % 3 == 0 ){
                    Duplicate = Duplicate+1;
                    count = count+1;

                    System.out.println(rep);
                    if (Duplicate <= 1)
                        System.out.println(i);
                }
            }

            if (count <= 0)
                System.out.println("Shipment numbers unavailable");
            if (count <= 0)
                break;
        }
    }
}
1
LearnerLaksh 4 czerwiec 2018, 17:04

5 odpowiedzi

Najlepsza odpowiedź

Twoim głównym problemem jest to, że robisz dziwne rzeczy z operatorem modulo. Nie obchodzimy, jeśli i można podzielić przez 3 lub nie.

Używasz również wielu zmiennych, których nie rozumiem, jak Duplicate.

Lub

for(int j = 1; j <= length; j++) {
    num = num / 10;
}

Które lubię pisać jako

while (num > 0) {
    num = num / 10;
}

Po prostu wykorzystuje mniej zmiennych.

W każdym razie, oto pełny kod, dodałem niektóre logiczne, aby wyglądało jak wymagane.

class Main
{
    public static void main(String[] args) {
        System.out.println("Enter the range for shipment numbers :");
        int n;
        boolean first = true;

        Scanner sc = new Scanner(System.in);
        int range1 = sc.nextInt();
        int range2 = sc.nextInt();

        for(int i = range1; i <= range2; i++){
            int num = i;
            boolean numberIsAwesome = true;

            while (num > 0)
            {
                n = num % 10;

                if(n % 3 != 0){
                    numberIsAwesome = false;
                }

                num = num / 10;
            }

            if (numberIsAwesome) {
                if (!first) {
                    System.out.print(", ");
                }
                System.out.print(i);
                first = false;
            }
        }
        System.out.println();
    }
}
0
Mark 4 czerwiec 2018, 14:30

Aby sprawdzić, czy każda cyfra jest podzielna przez 3, możesz zastąpić pętlę według następującego kodu. Po prostu idzie cyfry w prawo - do lewej i używa boolowskiego, aby pamiętać, czy wszystkie cyfry napotkane do tej pory były podzielne przez 3, używając logicznego i.

    for (int i = range1; i <= range2; i++) {
        int num = i;
        boolean isDivisible = true;

        while (num > 0) { 
            // get last (rightmost) digit to inspect
            int n = num % 10;

            isDivisible = isDivisible && (n % 3 == 0);
            // integer-divide by 10 to prepare for next round
            num = num / 10; 
        } 

        if (isDivisible) {
            System.out.println(i);
        }
    }

Słabością pokazanego kodu jest to, że tak jak oryginał, wygląda na całą liczbę, gdzie może ratować, gdy tylko kryterium podzielne przez 3 nie jest spełnione, ale łatwo się naprawić.

1
fvu 4 czerwiec 2018, 14:37

Oferuję użycie String.valueOf(i), aby otrzymać cyfry numerów:

public static Set<Integer> getDivisibleBy(int from, int to, int div) {
    IntPredicate isDivisibleBy = val -> {
        if (val % div != 0)
            return false;

        for (char ch : String.valueOf(val).toCharArray())
            if ((ch - '0') % div != 0)
                return false;

        return true;
    };

    return IntStream.rangeClosed(from, to).filter(isDivisibleBy).boxed().collect(Collectors.toCollection(TreeSet::new));
}
0
oleg.cherednik 4 czerwiec 2018, 15:10

Pomijam część skanera, ale wykorzystałem kod z niektórymi strumieniami Java 8 i Lambda może drastycznie zmniejszyć kod i skutkować lepszą czytelnością i konserwacją;

IntStream.rangeClosed(20, 40)
    .boxed()
    .filter(digit -> {
        boolean wholeDivisable = digit % 3 == 0;
        boolean partlyDivisable = Arrays.stream(digit.toString().split(""))
                .allMatch(strDigit -> Integer.valueOf(strDigit) % 3 == 0);

        return wholeDivisable && partlyDivisable;
    })
    .forEach(System.out::println);

IntStream.rangeClosed: Utwórz strumień intsbetween 20 i 40

boxed(): pudełko Int do całkowitego, jak chcemy podzielić go jako ciąg w naszym częściowym czeku. toString() odczytuje lepsze niż (digit+"").split("").

filter: Filtruj strumień liczby całkowitej sprawdzanie obu podzielnych jako całości + każda cyfra oddzielnie

forEach: dla każdego resztki elementu, druk do sout

0
Nico Van Belle 5 czerwiec 2018, 09:50

Oto jeden sposób, aby to zrobić. Konwertuj numer do łańcucha. Podziel łańcuch do łańcucha [], a następnie przekonwertuj każdy znak z powrotem do int i sprawdź, czy jest podzielny przez 3.

for(int i = range1; i <= range2; i++){
     boolean isDivisible = true;
     for (String value : String.valueOf(i).split("")) {
         if (Integer.valueOf(value) % 3 != 0) {
             isDivisible = false;
             break;
         } 
     } 

     if (isDivisible)  System.out.println("Is divisible: " + i);
}
0
dspano 5 czerwiec 2018, 10:58