fork download
  1. #!/usr/bin/perl
  2. use 5.016;
  3. use warnings;
  4.  
  5. # ref: http://p...content-available-to-author-only...t.jp/2009/01/blog-post_22.html
  6.  
  7. sub _sq {
  8. my ($n, $q, $s) = @_;
  9.  
  10. ($s > 0) or return $q;
  11.  
  12. return ($n >= $q + $s ?
  13. _sq($n - ($q + $s), $q / 2 + $s, int($s / 4)) :
  14. _sq($n, $q / 2, int($s / 4))
  15. );
  16. }
  17.  
  18. sub _ss { ($_[1] * 4 > $_[0]) ? $_[1] : _ss($_[0], $_[1] * 4) }
  19.  
  20. sub f { _sq($_[0], 0, _ss($_[0], 1)) }
  21.  
  22. foreach(0, 1, 4, 100, 5929, 788544, 99980001){
  23. say $_, " => ", f($_);
  24. }
  25.  
Success #stdin #stdout 0s 3736KB
stdin
Standard input is empty
stdout
0 => 0
1 => 1
4 => 2
100 => 10
5929 => 77
788544 => 888
99980001 => 9999