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

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

2 Likes

@medon3, решението със стрингове работи само за едноцифрени числа разделени с интервали. Ако имаме някъде число с повече от една цифра или отрицателно число, то решението няма да работи. Това е така, тъй като в логиката си винаги parse-ваш единствено едно символче от текста. От друга страна, за тези дето са използвали масиви: логиките на функции като split се базират на обхождането на String като последователност от Character-и, тоест има само цикли.

(Но тези split функции може да са много по-сложни, ако например използват регулярен израз, по който да split-ват, е необходимо да построят структура от данни като автомат за разпознаване или някаква друга помощна структура, която изобщо не е тривиална (не знам точно как е имплементирано в Java), но идеята е, че ако се опитате да избегнете някакъв подход като използвате някаква функция, то това не е точно избягване, тъй като подхода е имплементиран в самата функция, просто ние не го виждаме и я ползваме на готово).

Но в крайна сметка, независимо дали сме взимали нещо или не, работещо решение винаги е в пъти по-добре от липсващо.

1 Like

@andy Да, точно така е, това със Стринга също не е оптимално решение, сигурна съм че може да се реши по още много начини, мисля да опитам малко по-късно, но първо ще реша задачата със Спиралата. Също, според мен е много ценно че тук обменяме опит и се намират много различни начини за решение на една задача :slightly_smiling_face:

1 Like

Със сигурност не е правилно. Аз съм я направил без масиви.
Как, обаче, би направил 14та (SpiralMatrix), без да ползваш масив ???

1 Like

Има начин, да работи, стига числата да са отделени коректно, едно от друго (с интервал, запетая, или някакъв, друг знак, който не е цифра, без, да се използват масиви, или split.
Всъщност, подобно е на split, но не изисква ползването на масив. :slight_smile:

Всяка задача, може, да се реши по много и различни начини. Всичко зависи от начина, по който мисли решаващият. Успех! :+1:

1 Like

За абсолютно начинаещ като мен никак не е леко да вникна в немалко от нещата. До решение може би ще достигна, може би не. :blush:

Точно така! :upside_down_face:

Няма страшно! :slight_smile:

В задачата за спиралата няма нищо специално. Предполагам са я сложили само като teaser, тоест да подразнят, че не може да се сетим как да стане без масиви. Но реално задачата не е нищо повече от една много груба аритметика. Такъв тип задачи се решават с чертане на хартия доста време преди да успееш да намериш някакъв pattern (шаблон, по който да изчисляваш числото според позицията му). Подобен тип задачи, както и други за рисуване по конзолата нямат никакво приложение в реалния свят. Няма да казвам, че са чиста загуба на време, тъй като имат своята стойност (като например рисуването на триъгълника на Паскал може и да помага в подходи при решаване на комбинаторни задачи), но определено не са неща, за които трябва да се ядосваме, ако не сме се сетили.

import java.util.Scanner;

public class Problem14SpiralMatrix {
    public static void main(String... args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();

        int belowMain, aboveMain, x;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                belowMain = Math.min(i, j);
                aboveMain = Math.min(n - i - 1, n - j - 1);
                x = Math.min(belowMain, aboveMain);

                if (i <= j) {
                    System.out.printf("%d ", n * n + 1 - ((n - 2 * x) * (n - 2 * x) - (i - x) - (j - x)));
                } else {
                    System.out.printf("%d ", n * n + 1 - ((n - 2 * x - 2) * (n - 2 * x - 2) + (i - x) + (j - x)));
                }
            }
            System.out.println();
        }
    }
}
3 Likes

Благодаря на всички, които споделиха решения или мнения, всичко е полезно и от всеки може да се научи много, сигурна съм в това :slightly_smiling_face:

@andy Много благодаря за решението, ще го видя после, първо ще се опитам да я реша сама :slightly_smiling_face:

2 Likes

А би ли споделил тук на кое всъщност трябва да обърнем най-голямо внимание като заучаване и овладяване? Защото все пак за първи път повечето от нас се сблъскваме с програмирането, а ти определено не звучиш като един от нас:) Поздрави и Благодаря за инфото…

Малко ми е трудно да отговоря, но честно казано най-адекватния отговор май е „НА ВСИЧКО“. Това са базови/основни неща, трябва да се обърне внимание на абсолютно всичко, да се опитвате да счупите нещо, да експериментирате и да си задавате въпроса „това защо се държи така?“, да дебъгвате и да си давате отговор на този въпрос. Да сте любопитни и да сте алчни за повече, да не се задоволявате само с това което ви дава курса. Да решавате много задачи и да се тормозите :D. За съжаление това е рецептата.
NB: това, че в задачата за спиралата има два цикъла и един if не означава, че е тривиална. Определено е доста синтетична/изкуствена и неинтуитивна и е хубаво само да се опитате да я решите и ако не се получи да я оставите и може би след време пак да се върнете на нея. Но искам да кажа, че тя не е мерило за качества.

4 Likes