На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Быстро и карсиво разложить число по степеням (-2)
    А частное? ;)
      А нет ли способа "мгновенно" найти разложение для -Z из разложения для +Z ?

      ExpandedWrap disabled
        +123456789
         
        11000101011001101110100010101
         
         
        -123456789
         
        1001111001000111011100111111
         
         
        +345634295858585858375757682846739644999374848484657282929292929234215673853
         
        1110001001110001101000001100100001001010101011100110110100001111011010011000111111100
        1110111010100101000101000000011110001000011011101011010000110101111010001011010000001
        1100101000010011000001011010110001010111000000111100101001001011110000000001101
         
         
        -345634295858585858375757682846739644999374848484657282929292929234215673853
         
        1101001101101000011100000010110001101111111111010001001110000010100111000100110101010
        1101110111110111100111100000000101001100000111011100111000001110010111001100111000001
        10101111000110001000011001110010011111101000000010101111011011001010000000000111
        Цитата albom @
        А частное? ;)

        опять таки...-(частное)%-2 дает положительный результат, как я понял то что нужно
        (частное)%2 то же самое
        (частное)%-2 дает отрицательный результат и мы пренебрегая минусом записываем положительное число
        -(частное)%2 -то же самое

        в результате имеем, что в любом случае мы пренебрегаем отрицательным результатом..............
          итого, как бонус мы получаем 2 = -2 ! :)
            Цитата darcus @
            А нет ли способа "мгновенно" найти разложение для -Z из разложения для +Z ?
            Нет, и не может быть, так как сложность алгоритма не может быть меньше битового размера выхода.

            А вообще, знак в этой системе счисления у числа можно изменить двумя способами.
            Первый состоит в том, что мы складываем число с самим собой сдвинутым влево на один разряд.
            Второй способ состоит в вычитании из нуля нашего числа.
            Но учти, что даже сложнение в этой системе несколько необычно, так как сумма двух битов может порождать до двух битов переноса. Например,
             1 + 1     = 110
            11 + 1     = 0
             1 + 1 + 1 = 111


            Цитата kiryshka @
            опять таки...-(частное)%-2 дает положительный результат, как я понял то что нужно
            (частное)%2 то же самое
            (частное)%-2 дает отрицательный результат и мы пренебрегая минусом записываем положительное число
            -(частное)%2 -то же самое

            в результате имеем, что в любом случае мы пренебрегаем отрицательным результатом.
            А какое отношение все это имеет к исходной задаче? :lol:
              Цитата albom @
              А какое отношение все это имеет к исходной задаче? :lol:

              может я что то недопонимаю?
              10:

              10%-2=0
              -5%-2=1
              2%-2= 0
              -1%-2=1

              :huh:
                Цитата kiryshka @
                может я что то недопонимаю?
                Вероятно, да. А именно, как разделить одно число на другое.
                Правильно деление будет выглядеть так:
                10 / -2 = -5 rem 0
                -5 / -2 =  3 rem 1
                 3 / -2 = -1 rem 1
                -1 / -2 =  1 rem 1
                 1 / -2 =  0 rem 1
                Правильный ответ: 1010 = 11110-2, а вовсе не то, что у тебя получилось.
                  :huh: сорри
                    Прошу высказываться. только для положительный целых чисел
                    ExpandedWrap disabled
                      #include <stdio.h>
                      #include <math.h>
                       
                      int binarinegativ(int X){
                          int d =2,B,C,X1;
                          X1 = X;
                          printf("foundation (2) %d = %0.4X\n",X,X);
                          do{ B = X & d;
                              d *= 2;
                              if(B) X += d;
                              C = (int)( log(X)/log(2) ) ;
                              C = (int)pow(2,C);
                          }while(d < C );
                          printf("foundation (-2) %d = %0.4X\n",X1,X);
                          return X;
                      }
                       
                      int main(void){
                          int V;
                          while(1){
                           puts("Input digit, 0 fo exit\n");
                           if(!V) break;
                           scanf("%d",&V);
                           binarinegativ(V);
                          
                           getchar();
                      }
                          return 0;
                      }
                      Цитата AndreyK @
                      Прошу высказываться. только для положительный целых чисел
                      :no-sad:
                      Не работает ни для положительных, ни для отрицательных.

                      Кстати, можешь попробовать сделать через формулу Шреппеля:
                      B = (N xor 0b10101010101010...) - 0b1010101010....
                        это была попытка сделать *что*?
                          Приношу свои звинения за предыдущий вариант.
                          Этот, вроде, работает.
                          Раскладка натурального числа по основанию(-2)
                          X = k*(-2)i; где k 1 или 0,i - нумер разряда(нумерация от младшего к старшему начиная с нуля).
                          Опять же прошу высказываться.
                          ExpandedWrap disabled
                            #include <stdio.h>
                            #include <math.h>
                             
                            int binarinegativ(int X){
                                int d =2,B,C,X1;
                                X1 = X;
                                printf("foundation (2) %d = %0.4X\n",X,X);
                                do{ B = X & d;
                                    if(B) X += (d*2);
                                    d *= 4;
                                    C = (int)( log(X)/log(2) ) ;
                                    C = (int)pow(2,C);
                                }while(d <= C );
                                printf("foundation (-2) %d = %0.4X\n",X1,X);
                                return X;
                            }
                             
                            int main(void){
                                int V;
                                while(1){
                                 puts("Input digit, 0 fo exit\n");
                                 if(!V) break;
                                 scanf("%d",&V);
                                 binarinegativ(V);
                                
                                 getchar();
                            }
                                return 0;
                            }
                            Цитата AndreyK @
                            Этот, вроде, работает.
                            Увы, и этот вариант не работает. Неужели так сложно самостоятельно проверить хотя бы первые десять натуральных чисел? Ведь уже на них выдается неверный ответ. <_<
                            Цитата AndreyK @
                            Опять же прошу высказываться.
                            Я не очень понимаю смысл выкладывать вот эти исходники.
                            Во-первых, это не алгоритм, а код, причем код очень непонятный, который к тому же не работает.
                            Во-вторых, в этой теме уже приведено решение, даже есть работающий исходник. Почему не сравниваешь свою реализацию с ним?
                            И в-третьих, просили разложить "Быстро и карсиво", а тут увы нет ни того, ни другого.

                            Короче, давай, испрявляйся по всем пунктам, и показывай, что у тебя там получилось ;)
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0411 ]   [ 14 queries used ]   [ Generated: 16.07.25, 05:57 GMT ]