1. Java / Говнокод #17880

    +82

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    public class main {
    
    	public static void main(String[] args) {
    		Boolean[] table = new Boolean[1000001];
    		for(int i=2; i<=1000000; i++) {
    			table[i]=true;
    		}
    		Boolean cont=true;
    		int p=2;
    		while(cont) {
    		for(int i=2; i<=1000000; i++) {
    			try{
    			table[p*i]=false;
    			}
    			catch(Exception e) {}
    		}
    		int find=2;
    		while(!table[find]) find++;
    		if(find==2) {cont=false; break;}
    		p=find;
    	}
    		for(int i=2; i<=1000000; i++) {
    			if(table[i]) System.out.println(i);
    		}
    
    	}
    
    }

    Коротко о том, как найти нечетные числа от 2 до 1000000

    Запостил: MrFreeman, 28 Марта 2015

    Комментарии (73) RSS

    • Зато за один прием сразу три лабы сдал
      Ответить
      • Интересно, а в джаве имя файла должно совпадать с именем класса с учётом регистра или нет? И зависит ли это от ОС?
        Ответить
        • Зависит от класслоадера, скажем так. В общем случае файл вообще не обязан существовать.

          На штатном класслоадере под виндой загрузило и с кривым регистром. Под линухой обломалось. Походу тупо приклеивает binary name по очереди к каждому пути из CLASSPATH, доклеивает .class и пытается открыть. А там уже от операционки зависит.
          Ответить
          • Так вот как надо писать платформозависимые приложения на джаве)))
            Ответить
            • Ага.
              Только для никсов: делаем классы Test и test. На ФС винды один из них затрёт другой.
              Только для винды: компилим класс Test в файл test.class. Линуха обломается при загрузке.
              Ответить
              • > Только для никсов: делаем классы Test и test. На ФС винды один из них затрёт другой.
                Прокатит разве? На уровне исходников уже надо 2 файла, а если бинарник в jar'е, то его ж уже запаковали. Или бинарник в неупакованном в виде?
                Хотя.. линукс же умеет на ntfs записывать файлы, отличающиеся только регистром - я так один раз с виндовым каталогом на грабли наступил. Интересно, сумеет ли винда угдадать файл в таком варианте?
                Ответить
                • Так в том и суть! На винде даже скачать или распаковать исходники не получится - один из файлов проебётся. Мммаксимум платформозависимости.
                  Ответить
                • Под линупсом один тип сделал архив с ? в именах. 7z, кажется.
                  Ответить
                  • > сделал архив с ? в именах
                    Я так торрент умудрился скачать линупсом на NTFS'ный раздел. В имени одного из файлов был вопросик. Виндовые проги его показывали, но ни открыть ни удалить не могли.
                    Ответить
                    • Могли бы и добавить в лайнокс при монтировании ключик совместимости ограничений с виндой
                      Ответить
                      • Да могли бы и без ключика сделать эти ограничения. Ибо портить инварианты чужой ФС - не комильфо.
                        Ответить
                        • Ну это рекламная компания. Лайнус не мог не подгадить виньде
                          Ответить
                          • И правильно Винда то постоянно затирает бут линя. Уже два года надо переставить винду а лень бут восстанавливать придется.
                            Ответить
                            • При установке затирает или просто так от нехуй делать?
                              Ответить
                              • Старые - только при установке. А восьмёрка с UEFI постоянно передвигала свой загрузчик на первое место, пока немного не пошаманил.
                                Ответить
                                • >пока немного не пошаманил.
                                  снес к хуям собачим винду ?
                                  Ответить
              • Кстати, в питоне это пофиксили - import module не будет импортировать модуль из папки Module. Лучше бы они наконец-то юникод в консоли сделали.
                Ответить
            • Определение операционки:
              // probe.java -> probe.class
              public class Probe {
              };
              
              boolean isWindows() {
                  try {
                      this.getClass().getClassLoader().loadClass("Probe");
                      return true;
                  } catch (Exception e) {
                      return false;
                  }
              }
              Ответить
              • А вдруг dos?

                http://ithappens.me/story/185
                Ответить
                • Смех смехом, но виртуальные машины Java для DOS существуют. В DJGPP можно собрать и компилятор — gcj.

                  А ещё под ДОСом собирается DotGNU и даже исполняет консольные приложения .NET.
                  Ответить
    • Try catch какой-то параноидальный
      Ответить
      • Да не, он там за массив вылазиет просто :D
        Ответить
    • public class PrintOdd {
      public static void main(String[] args) {
      for(int i=0;i<10000;i++){
      if (i-2*(i/2)==1){
      System.out.println(i);
      }
      }
      }
      }
      Ответить
      • public class PrintOdd {
        public static void main(String[] args) {
        for(int i=0;i<10000;i++){
        if (i%2==1){
        System.out.println(i);
        }
        }
        }
        }
        Ответить
        • public class PrintOdd {
          public static void main(String[] args) {
          for(int i=0;i<10000;i+=2){
          {
          System.out.println(i);
          }
          }
          }
          }
          Ответить
    • public class Main {
      public static void main(String[] args) {
      for (int i = 0; i < 100000; System.out.println(i+=2));
      }
      }
      Ответить
    • Зацените код. Хочу знать какие ошибки и т.д. inb4: достойно отдельного поста

      package ru.govnokod.id17880;
      
      /**
      * The program implements an application that
      * simply shows odd numbers in range from 2 to 1000000.
      *
      * @author  Ray Mints
      * @version 1.0
      * @since   2015-07-18
      */
      public class Starter {
      	
      	/**
      	   * This method is used to find all odd numbers in range
      	   * @param rangeFirst The number we starts to look for odd numbers from. (Smallest)
      	   * @param rangeLast  The we finishes looking for odd numbers. (Biggest)
      	   * @return int [] This returns all odd numbers in range from rangeFirst till rangeLast.
      	   */
      	public static int [] oddNumbersInRange (int rangeFirst, int rangeLast){
      		int amountOfOddInRange = (rangeLast-rangeFirst)/2;
      		boolean firstNumIsOdd = !(rangeFirst%2==0);
      		boolean lastNumIsOdd = !(rangeLast%2==0);
      		if (firstNumIsOdd && lastNumIsOdd)
      			amountOfOddInRange +=1;
      		int [] oddNumbers = new int [amountOfOddInRange];
      		int tempOdd = rangeFirst;
      		if (!firstNumIsOdd)
      			tempOdd++;
      		int iterator=0;
      		while(tempOdd<=rangeLast){
      			oddNumbers[iterator]=tempOdd;
      			tempOdd+=2;
      			iterator++;
      		}
      		return oddNumbers;
      	}
      
      	/**
      	 * This method displays an array on the screen.
      	 * @param arrayToShow is the integer array we show.
      	 */
      	static void output(int[]arrayToShow){
      		for(int i=0; i<arrayToShow.length; i++){
      			System.out.print(arrayToShow[i] + " ");
      			if (i%10==0)
      				System.out.println();
      		}
      	}
      
      	public static void main(String[] args) {
      		output(oddNumbersInRange(2, 1000000));
      	}
      }
      Ответить
      • Задачка для собеседования/лаба?
        Ответить
        • Нет. Просто вот начал учить программирование. Хочу писать правильно. Выше писали решение в 5 - 10 строчек. Но зато у меня универсальность и javadoc. Вообще думаю лучше бы переписать oddNumbersInRange, чтоб он искал и четные, и нечетные, в зависимости от boolean на входе и вынести метод в отдельный класс.
          Ответить
          • > javadoc
            Это хорошо.

            > переписать oddNumbersInRange
            Обобщать - так по полной. Делай функцию, которая выбирает числа, которые при делении на N дают остаток R Или в самом общем виде - на входе получает предикат, и возвращает числа, для которых он вернул true... Можно ещё поиграться с итераторами вместо массивов, чтобы получить решение с O(1) по памяти.

            Но, имхо, лучше попробуй более практичные задачки. Какую-нибудь простенькую игрушку или утилитку напиши. Там и проблемы будут возникать поинтереснее, и фана больше, и обстановка будет приближена к боевой...
            Ответить
            • Да я думал уже писать какую-то игрушку. А потом понял, что у меня знаний мало и я вовсе не буду знать насколько качественно то, что я делаю. И правильно ли делаю. И вообще половина кода буде скопирована со stackoverflow. Некому будет проверить и дать подзатыльник.
              Ответить
              • > А потом понял, что у меня знаний мало
                Да не ссы, в процессе всё нужное найдешь. Все через это когда-то проходили... Ну а сейчас вам даже попроще - гугл есть под рукой.

                > И правильно ли делаю
                Да даже если неправильно - ничего страшного. С первого раза правильно писать, имхо, никому не удаётся. Постепенно опыта наберёшься, что-то подсмотришь у других, что-то подскажут. И будешь писать лучше ;) Да и единственно правильного способа почти никогда нет...
                Ответить
                • >Ну а сейчас вам даже попроще - гугл есть под рукой.
                  угу, и говно всякое советуют
                  Ответить
              • Чем в итоге всё закончилось?
                Ответить
      • > !(rangeFirst%2==0)
        != для кого придумали?

        > while(tempOdd<=rangeLast){
        Ну раз уж количество выше посчитал, по нему бы и останавливал цикл.
        Ответить
      • if (firstNumIsOdd && lastNumIsOdd)
        amountOfOddInRange +=1;

        без фигурных скобок и на разных строках. Убил бы.
        Ответить
        • Норм всё. Сишники часто так пишут. Лишь бы отступ был.

          P.S. А вот на одной строке писать такие штуки не стоит.
          Ответить
          • почему ? это же if( condition ) funct();
            читабельней же
            Ответить
      • Ещё претензия по стилю - ставь пустые строки между логически независимыми блоками. Перед некоторыми даже коммент можно написать. И не ленись ставить пробелы вокруг операторов и т.п.
        Ответить
        • Окей. Учту. Спасиб.
          Ответить
          • Вот так, например, можно разбить:
            public static int [] oddNumbersInRange(int rangeFirst, int rangeLast) {
                // calculate how many odd numbers there are in the range
                int amountOfOddInRange = (rangeLast - rangeFirst) / 2;
                boolean firstNumIsOdd = rangeFirst % 2 != 0;
                boolean lastNumIsOdd = rangeLast % 2 !=0;
                if (firstNumIsOdd && lastNumIsOdd)
                    ++amountOfOddInRange;
            
                int [] oddNumbers = new int [amountOfOddInRange];
            
                int tempOdd = rangeFirst;
                if (!firstNumIsOdd)
                    ++tempOdd;
            
                for (int i = 0; i < amountOfOddInRange; ++i) {
            	oddNumbers[i] = tempOdd;
                    tempOdd += 2;
                }
            
                return oddNumbers;
            }
            Лучше же читается?
            Ответить
      • https://ideone.com/M0AESt
        Ответить
        • > Акелла промахнулся
          Акела лоханулся и дооптимизировался:
          1) odd - нечётные;
          2) некорректно определяет количество если начало и конец чётные.

          Мама не учила писать юнит-тесты? https://ideone.com/qY8qNQ
          Ответить
        • > boolean lastNumIsOdd = !(rangeLast%2==0);
          > 		if (firstNumIsOdd && lastNumIsOdd)
          > 			amountOfOddInRange +=1;

          > var next = ((from + 1) & ~1) - 2;

          Почему так сложно? Зачем столько странных значков?
          По мне - так провести "валидацию", выровнять исходные данные - да и дело с концом.
          https://ideone.com/SR8Dch
          Ответить
          • А как же выебоны?
            Ответить
            • Вот, кстати, когда открыл http://govnokod.ru/17880#comment293489, подумал, что там будет что-то вида
              x = 0
              y = 9
              main = mapM print . filter ((/= 0) . (`mod` 2)) $ [x..y]

              Ну или позаковыристей что-нибудь.
              Ответить
              • выебоны же

                main = mapM_ print $ getOdd 1 9
                
                getOdd x y | odd x     = [x,x+2..y]
                           | otherwise = [x+1,x+3..y]
                Ответить
          • > выровнять исходные данные
            Въебал плюсца.
            Ответить
          • Да. Пожалуй и так можно.
            Ответить
          • И ты зафейлил, брут.

            https://ideone.com/5JEK8Z

            P.S. Эпичная задача, можно смело давать на собеседовании.
            Ответить
            • Мда, значит надо зачищать обе границы, одной недостаточно.
              https://ideone.com/fSrVFy
              Теперь возьмёте?
              Ответить
              • > зачищать обе
                Да просто проверить после корректировки, что интервал не улетел.
                Ответить
                • И правда. Если двигать на единичку концы, фигня вида [7, 3] ломает. Если двигать один конец и проверять, всё прокатывает.
                  Мда, серьёзная задачка.
                  Ответить
                  • А ведь мы ещё не задумывались, что числа могут быть отрицательными... И о переполнениях.
                    Ответить
                    • Я об отрицательных подумал, а вот переполнение - это да.

                      В общем любая мелкая задача содержит много каверзных моментов
                      Ответить
              • >> Теперь возьмёте?

                Писать код за анальные утехи - теперь я видел все
                Ответить
    • >> static void output(int[]arrayToShow)

      назови функцию нормально. PrintArray там
      Ответить
    • Акелла промахнулся
      Ответить
    • - Парень дело говорит, - донёсся до них голос врача.
      Ответить

    Добавить комментарий