Odd and Even Product - Задача от Домашно за Цикли

Здравейте на всички! Правя нова тема, защото тази задача има два варианта - един, който е в Практическите задачи, където условието е доста по-ясно, защото имаме точен брой числа, които се въвеждат на отделни редове, и тази от домашното, където не въвеждаме броя на числата, а директно въвеждаме всички числа на един ред. Аз използвам масив за да реша задачата, но това, което ме затрудни е условието да се започва броенето на позициите от 1, резултатът който получавам е верен, но произведенията на четни и нечетни са разменени. Ще се радвам някой да сподели мнение за тази задача. Ето и цялото условие: You are given n integers (given in a single line, separated by a space).

Write a program that checks whether the product of the odd elements is equal to the product of the even elements.

  • Elements are counted from 1 to n , so the first element is odd, the second is even, etc.

Вероятно има лесно решение, но в момента не се сещам, ето моят код:

Scanner sc = new Scanner(System.in);

    //I could not think of a solution without using arrays

    String arr = sc.nextLine();
    String[] givenNumbersAsString = arr.split(" ");
    int[] numbers = new int[givenNumbersAsString.length];
    int n = givenNumbersAsString.length;

    int productOdd = 1;
    int productEven = 1;

    for (int i = 0; i < n; i++) {
        numbers [i] = Integer.parseInt(givenNumbersAsString[i]);

        System.out.println(numbers[i]);
        if (i % 2 == 0 ) {
            productEven = productEven * numbers[i];
        } else {
            productOdd = productOdd * numbers[i];
        }

    }
    System.out.println(productEven);
    System.out.println(productOdd);

    if (productEven == productOdd) {
        System.out.println("yes");
    } else {
        System.out.println("no");
    }

}

}

Здравей!
Опитай като смениш “if (i % 2 == 0 )” с “if (i % 2 != 0 )”
Поздрави!

1 Like

Защо принтираш самите числа в loop-a ?

1 Like

Аз чак днес намерих решение докато проверявах задачите на колегите!

2 Likes

Здравейте на всички и много благодаря за отговорите! @miroslav.ivnv - това принтиране си го правя за собствена проверка, да съм сигурна че не изпуска числа от масива, то няма отношение към крайния резултат, забравила съм да го махна. @anon71502059 Да, твоето предложние просто да печатам четни на мястото на нечетни е хитро, и работи, но аз си мислех дали може да стане просто със започване на позициите от 1, но не успях да го измисля. :slightly_smiling_face: Иначе, да, би могла и със стринг да се реши, но понеже я довършвах в последния момент и нямах време, ще си поиграя сега сигурно, но такова решение може би ще работи само с положителни числа, не знам, или може първото да е отрицателно … @vanioni9 Благодаря за твоето решние, то е доста подобно на моето, но е с два цикъла, пробвах го, то също разменя четни и нечетни произведения Отново благодаря на всички :blossom: :tulip: :sunflower:

1 Like

В масив първият елемент винаги е с индекс 0, така че другото, което мога да ти предложа е да въртиш цикъла от 1 до n, но за да вземеш елемент от масива да използваш i-1.
Поздрави!

1 Like

Много благодаря за помощта! Така наистина стана без да разменям произведенията :slightly_smiling_face: Иначе поствам и решението със стринг, което също минава, защото са зададени само положителни числа за вход Scanner sc = new Scanner(System.in);

    //You are given n integers
    // (given in a single line, separated by a space).
    //Write a program that checks whether the product
    // of the odd elements is equal to the product of the even elements.
    //Elements are counted from 1 to n,
    // so the first element is odd, the second is even, etc.

    String numbersAsString = sc.nextLine();

    String noSpaceStr = "" + numbersAsString;
    String noSpaceStr2 = noSpaceStr.replaceAll("\\s", "");

    int productOdd = 1;
    int productEven = 1;

    for (int i = 1; i <= noSpaceStr2.length(); i++) {
        int   digit = Integer.parseInt("" + noSpaceStr2.charAt(i-1));

        if (i % 2 == 0) {
            productEven = productEven * digit;
        } else {
            productOdd = productOdd * digit;
        }

    }
    System.out.println("Even product: " + productEven);
    System.out.println("Odd product: " + productOdd);

    if (productEven == productOdd) {
        System.out.println("yes");
    } else {
        System.out.println("no");
    }

}

}

Без масиви:

import java.util.Scanner;

public class Problem13OddAndEvenProduct {
    public static void main(String... args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter integers with space delimiter: ");

        int oddProd = 1;
        int evenProd = 1;
        int current = 1;

        boolean odd = true;

        String integersLine = scanner.nextLine();

        int marker = 0;

        for (int i = 0; i < integersLine.length(); ) {
            for (int j = i; j <= integersLine.length(); j++) {
                if (j == integersLine.length() || integersLine.charAt(j) == ' ') {
                    current = Integer.parseInt(integersLine.substring(marker, j));
                    i += i - j + 1;
                    marker = j + 1;
                    break;
                } else {
                    i++;
                }
            }

            if (odd) {
                oddProd *= current;
            } else {
                evenProd *= current;
            }

            odd ^= true;
        }

        if(oddProd == evenProd){
            System.out.printf("yes %d%n", oddProd);
        } else{
            System.out.printf("no %d %d%n", oddProd, evenProd);
        }
    }
}
3 Likes

@andy Много интересно решение, благодаря че го сподели!

Здравей,
Това е моето решение, ще вземе да излезе, че ти ме проверяваш :smile:

Съдба:) Мерси за решението!

Моля. Иначе идеята е много простичка. Базираме се на даденото по условие, че ако има различен символ от " " (space), то той ще бъде част от число. Итерираме външно по целия ред и вътрешно по всички символи, които не са space, знаейки че като дойде space ще свършва числото. Остана да проверим само каква част сме итерирали (от къде до къде) от реда, за да може чрез функцията subString да извлечем това число и да сме спокойни, че ще може да се parse-не.
Важните моменти са, че трябва да пазим маркер, чрез който да актуализираме къде е свършвало предходното число и респективно къде ще започва следващото и да внимаваме, ако дойде края на реда подаден на входа.

2 Likes

@andy Страхотно, благодаря за обяснението! Иначе докато решавах една друга задача от домашното, попаднах на насоки за използване на някои методи от Character class от менторите, които мисля са доста полезни, поне за мен бяха за решението на задача 13 от домашното Java Character Class - Javatpoint Но я реших след като го предадох за съжаление :slightly_smiling_face:

@medon3 Избягвах да ползвам статични методи на Character, като например Character.isDigit(…), който би бил полезен, но представи си имаме число от редицата, което е отрицателно, например “3 12 -2 3 -10 2”. В такъв случай функцията на Character, която проверява дали дадения символ е цифра, ще изгърми на знака минус или най-малкото ще индикира, че това не е число, а пък то е част от числото. Тези проблеми ще expand-нат много логиката на задачата, за това ги избягвах. Реално условието на задачата, че ако не е space ще е част от число ни помага доста.

2 Likes

Да, така е, тези методи крият рискове, но понякога спестяват писане, аз ги използвах най-вече за задачите от серията Word or Number, които могат да се решат и по други начини разбира се

1 Like

gama2003 е права, защото, започвайки броенето от нула, всъщност, числата на четна позиция в реда, са под нечетен номер в масива :slight_smile:

1 Like

Важното е че намерихме повече от едно решение :slightly_smiling_face:

Имайки предвид, че задачата е от урока за цикли и масивите не са преподадени, дали е правилен подход да се тръгва към решение със същите. Да, най-вероятно така е по-лесно да се достигне до решението на проблема, но според мен идеята тук е съвсем друга.

1 Like

Съгласна съм, аз лично предадох в домашното решение с масиви, защото нямах достатъчно време да обмисля задачата на спокойствие (вината за това е изцяло моя), после я реших и със Стринг - постнах го по-горе, други колеги също споделиха решения без масив

1 Like