Golf the Chinese 9*9 multiple table
Stax, 66 characters
9mYF&quot;得一二三四五六七八九&quot;cacy*~@ny@\p;11AH:b!n;A/X@]z?px'十z?p,A%sn@]z?' +qD

Number of bytes depends on the encoding used for Chinese characters.
Run and debug online!
Explanation
9mYF...D    Loop `n` times and print a newline after each loop, `n`=1..9

&quot;...&quot;cay*~@ny@\p
&quot;...&quot;c              Push the string and duplicate it
      ay            Fetch the outer loop variable
        *           Multiply with the inner loop variable
         ~          Move the product to input stack for later use
          @         Take character at the index specified by inner loop variable
           ny@      Take character at the index specified by outer loop variable
              \p    Print the two characters

;11AH:b!n;A/X@]z?p
;11AH:b!        ?p    Is the product not in range [11,20)?
                      Output (*) if true, (**) if false.
        n;A/X@        Character at the index of the &quot;ten&quot; digit of product
              ]       Convert character to string (*)
               z      Empty string (**)

x'十z?p,A%sn@]z?' +q
x'十z?p                Print &quot;十&quot; if the &quot;ten&quot; digit is non-zero, nothing otherwise
       ,A%sn@]z?       Get the character specified by the last digit if that digit is non-zero, empty string otherwise
                ' +q   Append a space and print

Alternative version (Stax 1.0.6), 59 bytes (by @recursive)
This uses a feature that is inspired by this challenge and is only included in Stax 1.0.6 which postdates the challenge.
éz░╖▐5à{│`9[mLùÜ•ëO╞îπl▼Γ─§╥|▒╛Δ◙Φµ'r╠eƒÿQ╫s♪Ω]£ï♪D3╚F◙δÿ%‼

The ASCII version is
9mX{x\_x*YA/]yA-y20&lt;*!*+y9&gt;A*+yA%]0-+&quot;NT|,,t.%,p&amp;()(!'^pq kzi !X6&quot;!s@mJ

This version constructs the index array and then uses it to index the string of Chinese characters to avoid redundant stack operations (c,a,n) and multiple @s.
Explanation
9mX{...m    Loop `n` times and map `1..n` to a list of strings, `n`=1..9
        J   Join the strings with space and print with a newline

x\_x*YA/]yA-y20&lt;*!*+y9&gt;A*+yA%]0-+&quot;...&quot;!s@
x\                                           A pair: (inner loop variable, outer loop variable)
  _x*Y                                       Product of inner and outer loop variable
      A/                                     floor(product/10)
        ]                                    [floor(product/10)]
         yA-                                 Product does not equal 10
            y20&lt;                             Product is less than 20
                *!                           `Nand` of them
                                             This is true (1) if the product is in the range {10}U[20,81]
                  *                          Repeat [floor(product/10)] this many times
                                             This results in itself if the predicate above is true, or empty array if it is false
                   +                         Add it to the list of [inner loop var, outer loop var]
                                             This list will be used to index the string &quot;得一二三四五六七八九十&quot;
                    y9&gt;A*                    Evaluates to 10 if the product is larger than 9, 0 otherwise
                                             When indexed, they become &quot;十&quot; and &quot;得&quot;, respectively
                         +                   Append to the list of indices
                          yA%                Product modulo 10
                             ]0-             [Product modulo 10] if that value is not zero, empty array otherwise
                                +            Append to the list of index
                                 &quot;...&quot;!      &quot;得一二三四五六七八九十&quot;
                                       s@    Index with constructed array