|
kuing
posted 2025-6-26 00:53
今天讨论组群又提到这个短除法:
我就想起本帖,看了 9 年前 2# 的代码,是要人工计算每一行数值的,不太方便。
这次学习了 \tikzmath 的定义函数的玩法,实现了更自动化的画法:
- \documentclass{article}
- \usepackage{tikz}
- \begin{document}
- \usetikzlibrary{math,positioning}
- \tikzmath{
- int \q, \r, \i; coordinate \c; \c=(0,0);
- function dcf(\n,\d){
- \i=0;
- {\node (q0) at (\c) {$\n$};};
- dcf2(\n,\d);
- };
- function dcf2(\n,\d){
- if \n == 0 then {} else {
- \q = \n/\d;
- \r = \n-\d*\q;
- {
- \coordinate (tmp) at (q\i.south east);
- \draw (q\i.north west) |- node[left,pos=0.25]{$\d$} (tmp);
- };
- \i = \i+1;
- {
- \node[below=0pt of tmp,anchor=north east] (q\i) {$\q$};
- \node[right=0pt of q\i] (r\i) {$\cdots\r$};
- };
- dcf2(\q,\d);
- };
- };
- }
- % 666 的 2 进制
- \tikz{\tikzmath{dcf(666,2);}}
- % 2048 的 3 进制,加箭头
- \tikz[>=latex]{
- \tikzmath{dcf(2048,3);}
- \draw[->] (r7.-90) -| (r1.north east);
- }
- \end{document}
Copy the Code 效果:
第二个图利用那些余数 node 的名字来加类似 2# 的箭头,(r1) 和 (r7) 就是(自上而下的)第一和第七个余数,商的则是 (q1) 等,(q0) 是最开头的被除数,都可以用。
另外,还可以在 dcf(...) 之前加一句 \c=(坐标); 来指定被除数的坐标(当需要一个图里画多个,或者图里还有其他东西时就可能有用(这里懒得演示))。 |
|