1. Си / Говнокод #15895

    +132

    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
    #include <stdio.h>
    
    unsigned int mid (unsigned int a, unsigned int b)
    {
    	if (a > b) {unsigned int c = a; a = b; b = c;}
    	for(; a < b; a--, b++) {;};
    	return a;
    }
    
    int main(void) {
    	printf("%u %u %u %u", mid(2,2), mid(3,2), mid(2,3), mid(3,3));
    	return 0;
    }

    Это я хочу найти середину. Где-то я туплю

    Запостил: j123123, 04 Мая 2014

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

    • http://ideone.com/ZMotfK вроде, починил
      Ответить
      • И да, алгебра в целых и в рациональных в общем случае не решаема, так что не парся, сразу берись за вещественные.
        Ответить
    • cleaned
      Ответить
    • @{;};}@
      Ответить
      • даже так.

        +---------+
        |   _+_   |
        |  ( | )  |
        |  wvxvw  |
        | @{;};}@ |
        |  /\./\  |
        | /  |  \ |
        +/---+---\+
        Ответить
        • Это корона?
          Ответить
          • cleaned
            Ответить
          • THIS...IS......GOATSEE!!!
            Ответить
            • Человек стоит лицом к нам, опершись на сведенные руки, разведя ноги и подняв жопу вверх. Из жопы торчит, кхм, крест. Видимо wvxvw хотел изобразить крестоблядь...
              Ответить
              • >wvxvw хотел изобразить крестоблядь...
                Но почему на нём написано wvxvw?
                Он ведь не пишет на чем угодно, но не на крестах. Да и вообще где здесь С++?
                Ответить
                • > Да и вообще где здесь С++?
                  Как где? Вон же + из жопы изображенного на портрете торчит, остальные символы, видимо, внутри.

                  > Но почему на нём написано wvxvw?
                  Это волосы. Они даже другим цветом выделены.
                  Ответить
    • По какой причине был выбран столь странный алгоритм?
      Ответить
      • Потому что интересный алгоритм, мне нравится this way of thinking
        Ответить
        • Уже было несколько раз. Даже рекурсивное сложение/умножение.
          Но не парься, нормальный компилятор сможет выпилить твой "way of thinking" и оставить пару команд.
          Ответить
          • 0000000000400560 <mid>:
              400560:	55                   	push   %rbp
              400561:	48 89 e5             	mov    %rsp,%rbp
              400564:	89 7d ec             	mov    %edi,-0x14(%rbp)
              400567:	89 75 e8             	mov    %esi,-0x18(%rbp)
              40056a:	8b 45 ec             	mov    -0x14(%rbp),%eax
              40056d:	3b 45 e8             	cmp    -0x18(%rbp),%eax
              400570:	76 14                	jbe    400586 <mid+0x26>
              400572:	8b 45 ec             	mov    -0x14(%rbp),%eax
              400575:	89 45 fc             	mov    %eax,-0x4(%rbp)
              400578:	8b 45 e8             	mov    -0x18(%rbp),%eax
              40057b:	89 45 ec             	mov    %eax,-0x14(%rbp)
              40057e:	8b 45 fc             	mov    -0x4(%rbp),%eax
              400581:	89 45 e8             	mov    %eax,-0x18(%rbp)
              400584:	eb 0a                	jmp    400590 <mid+0x30>
              400586:	eb 08                	jmp    400590 <mid+0x30>
              400588:	83 6d ec 01          	subl   $0x1,-0x14(%rbp)
              40058c:	83 45 e8 01          	addl   $0x1,-0x18(%rbp)
              400590:	8b 45 ec             	mov    -0x14(%rbp),%eax
              400593:	3b 45 e8             	cmp    -0x18(%rbp),%eax
              400596:	72 f0                	jb     400588 <mid+0x28>
              400598:	8b 45 ec             	mov    -0x14(%rbp),%eax
              40059b:	5d                   	pop    %rbp
              40059c:	c3                   	retq
            Ответить
          • 0000000000400590 <mid>:
              400590:	39 f7                	cmp    %esi,%edi
              400592:	89 f8                	mov    %edi,%eax
              400594:	76 12                	jbe    4005a8 <mid+0x18>
              400596:	89 f0                	mov    %esi,%eax
              400598:	89 fe                	mov    %edi,%esi
              40059a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
              4005a0:	83 e8 01             	sub    $0x1,%eax
              4005a3:	83 c6 01             	add    $0x1,%esi
              4005a6:	39 f0                	cmp    %esi,%eax
              4005a8:	72 f6                	jb     4005a0 <mid+0x10>
              4005aa:	f3 c3                	repz retq 
              4005ac:	0f 1f 40 00          	nopl   0x0(%rax)
            Ответить
    • показать все, что скрытоРаздача минусов объявлена открытой.
      Ответить
    • А почему декремент на меньшем числе, а инкремент на большем? Какую-то не ту середину оно ищет, прямо противоположную настоящей ;)
      Ответить
      • Ну да, но вообще нет. Просто нельзя найти середину между нечетным и четным, поэтому оно показывает бред
        Ответить
        • > Просто нельзя найти середину между нечетным и четным, поэтому оно показывает бред
          Нет. Оно именно не ту середину ищет. Если представить unsigned числа как окружность (а из-за переполнения это именно окружность, а не луч), а входные данные - как две точки на ней, то мы получим как раз 2 "середины". Этот код выбирает ту, которая на дуге (b, a) (что кажется странным), а исправленный - на дуге (a, b) (что вполне интуитивно).

          А то, что в целых числах не найти середину между 2 и 3 вполне решается округлением по одному из правил. В случае с for(; a < b; a++, b--); return a; - в большую сторону.
          Ответить
          • Да, не ту. Но почему 4294967295 ?
            Ответить
            • А потому что я затупил, нихера там не кольцо. Как только левый край отрезка перевалит через 0, он сразу же станет больше правого, и алгоритм остановится. Поэтому и получается это 2^32 - 1.
              Ответить
          • Образно говоря, мы хотели идти навстречу друг другу, но пошли в противоположные стороны. Мы могли бы встретиться, потому что мир - кольцо. Но мир не кольцо
            https://www.youtube.com/watch?v=mqAf5lOJZew
            Ответить

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