Advertisement
Bodigrim

getDivisorPower and getNumberPower

Jun 9th, 2011
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. \catcode `\@11 % делаем @ обычной буквой
  2.  
  3. \newif\ifdivisible % объявляем булеву переменную
  4. \newcount\testMod@n % объявляем числовую переменную
  5. \def\testMod#1#2{ % объявляем макрос с двумя аргументами
  6. \testMod@n=#1 % помещаем в testMod@n первый аргумент
  7. \divide\testMod@n by#2 % делим нацело на второй аргумент
  8. \multiply\testMod@n by#2 % и умножаем на него же
  9. \ifnum#1=\testMod@n % если в результате получился снова первый аргумент,
  10. \divisibletrue % значит остатка не было,
  11. \else % а иначе
  12. \divisiblefalse % был
  13. \fi%
  14. }
  15.  
  16. \newcount\divisorpower % здесь будем хранить текущее значение а,
  17. \newcount\getDivisorPower@m % а здесь - n/d^a
  18. \def\getDivisorPower#1#2{
  19. \getDivisorPower@m=#1 % инициализируем переменные
  20. \divisorpower=0 %
  21. \testMod{\getDivisorPower@m}{#2} % проверяем, делится ли на d
  22. \loop\ifdivisible % while-цикл, проверяющий условие divisible
  23. \advance\divisorpower by1 % увеличиваем a на 1
  24. \divide\getDivisorPower@m by#2 % делим на d
  25. \testMod{\getDivisorPower@m}{#2} % снова проверяем, делится ли на d
  26. \repeat % возвращаемся к началу цикла
  27. }
  28.  
  29. \newcount\numberpower % здесь будем хранить результат возведения в степень
  30. \newcount\getNumberPower@pow % а здесь - сколько раз еще осталось умножить
  31. \def\getNumberPower#1#2{
  32. \numberpower=1 % инициализируем переменные
  33. \getNumberPower@pow=#2
  34. \loop\ifnum\getNumberPower@pow>0 % запускаем цикл
  35. \multiply\numberpower by#1
  36. \advance\getNumberPower@pow by-1
  37. \repeat
  38. }
  39.  
  40. \catcode `\@12 % делаем @ обратно спецсимволом,
  41. % чтобы избежать непосредственного доступа к "локальным" переменным
  42. % из дальнейшего кода
  43.  
  44. \getDivisorPower{600}{2}
  45. \number\divisorpower
  46. \getDivisorPower{600}{3}
  47. \number\divisorpower
  48. \getDivisorPower{600}{5}
  49. \number\divisorpower
  50. \getDivisorPower{600}{7}
  51. \number\divisorpower
  52. % должно вывести "3 1 2 0"
  53.  
  54. \getNumberPower{5}{0}
  55. \number\numberpower
  56. \getNumberPower{6}{1}
  57. \number\numberpower
  58. \getNumberPower{7}{2}
  59. \number\numberpower
  60. % должно вывести "1 6 49"
  61.  
  62. \end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement