[Архив!] Чистая математика, физика, химия и т.п.: задачки для тренировки мозгов, никак не связанные с торговлей - страница 511

 

MaxZ:

Мне изменения понятны. Я только вот это не осилил пока:

   for(int i=5;i>-1;i--)
     {
      XX|=int(1<<A[i]);
     }
   if(XX==0x7E) {return true;}

"|=" - логическое "ИЛИ"? А вот дальше полный тупик...

"|=" - в данном случае побитовое "или". Эта штука поднимает биты на XX в позициях равных A[i].

И если после цикла все биты с первого по шестой окажутся равными 1, это будет означать что все цифры с 1 по 6 встретились в числе X ровно по одному разу.

0x7E - шестнадцатеричное представление двоичного числа 1111110. (правый бит - нулевой)

 
jartmailru:

А может, ввсе же в С++ ?
.
Validate- функция одного параметра.
Может по старинке... выделяем память и кэшируем bool
для всех допустимых значений аргумента?

В MQL можно открыть ордер, если вдруг чудом хоккейные числа поделятся нацело! :))

А если серьёзно, то Я точно не ровня Вам.


MetaDriver:

"|=" - в данном случае побитовое "или". Эта штука поднимает биты на XX в позициях равных A[i].

И если после цикла все биты с первого по шестой окажутся равными 1, это будет означать что все цифры с 1 по 6 встретились в числе X ровно по одному разу.

0x7E - шестнадцатеричное представление двоичного числа 1111110. (правый бит - нулевой)
Вот это больше всего мучило. Спасибо. Дошло!
 
jartmailru:

1. А может, ввсе же в С++ ?
.
2. Validate- функция одного параметра.
Может по старинке... выделяем память и кэшируем bool
для всех допустимых значений аргумента?

1. Ну язык и среда это кагбе не суть. Суть - сам алгоритм.

2. Эээ.. А подробнее?

 
MaxZ:

Но 125 ms явно не догнать.

Зря ты так. У тебя показывает 47 ms

Жаль решения у задачки нету, результаты сложно сравнивать... :)))

.

Только я всё равно не догнал зачем сравнивать посимвольно

if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)

?

Вроде бы совпадения в отдельно взятой позиции некритичны?

 
MetaDriver:

Зря ты так. У тебя показывает 47 ms

Жаль решения у задачки нету, результаты сложно сравнивать... :)))

.

Только я всё равно не догнал зачем сравнивать посимвольно

if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)

?

Вроде бы совпадения в отдельно взятой позиции некритичны?

Во те на! :DDD


Я боролся за быстродействие.

Считаю, что условие:

if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)

выполнится во много раз быстрее следующих строк:

int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;

А срабатывает это условие не мало раз. Получается неплохой выигрыш в быстродействии. Хотя может и не такой существенный. Можно убрать и проверить. Но всё же Я на стороне того, что это условие оправдывает себя.

 
MaxZ:


Я боролся за быстродействие:

Считаю, что условие:

if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)

выполнится во много раз быстрее следующих строк:

int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;

А срабатывает это условие не мало раз. Получается неплохой выигрыш в быстродействии. Хотя может и не такой существенный. Можно убрать и проверить. Но всё же Я на стороне того, что это условие оправдывает себя

Но оно вроде некорректно. Например, при A4==B4 условие окажется ложным, тогда как числа могут быть и различными (например 654321 и 124365)
 

поправил, сделал так

                                    for(int B1=1; B1<=6; B1++)
                                      {
                                       if(B1==B2 || B1==B3 || B1==B4 || B1==B5 || B1==B6) continue;
//                                       if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)
                                         {
                                          int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                                          int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                                          if (A==B) continue;
                                          if(MathMod(A,B)==0)
                                             Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                                         }
                                      }
                                   }

Те же 47 ms

Так что - нефиг париться с этим условием.

 
MetaDriver:

поправил, сделал так

Те же 47 ms

Так что - нефиг париться с этим условием.

Понял ошибку... А Я о быстродействии твержу! :)) Голова совсем не варит. Спать уже пора. Моё местное время 6 утра...

А с кодом надо значит так:

                                    for (int B1=1; B1<=6; B1++)
                                    {
                                       if (B1==B2 || B1==B3 || B1==B4 || B1==B5 || B1==B6) continue;
                                       if (A6==B6 && A5==B5 && A4==B4 && A3==B3 && A2==B2 && A1==B1) continue;
                                       
                                       int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                                       int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                                       if (A < B) continue;
                                       if (MathMod(A,B)==0)
                                           Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                                    }

А вот это уже слишком

                                       if (A==B) continue;
                                       if (MathMod(A,B)==0)

так как скрипт будет лишний раз меньшее на большее делить...

 

Блин. Володь И этим надо замораживаться? Ну вот - уволь! Сколько можно!

Твой - Свин. Искренне...

 
MaxZ:

А с кодом надо значит так:


Ага так лучше. 31 ms.

Svinozavr 22.08.2011 01:58

Блин. Володь И этим надо замораживаться? Ну вот - уволь! Сколько можно!

Твой - Свин. Искренне...

Каприз художника.... :)

За неделю надоедают меркантильные мотивации. Иногда и оторваться можно из любви к искусству. ;)

Причина обращения: