• 締切済み

Perlでのルート計算で、小数点ではなく√を使って表示させたい。

perlでのルート計算はsqrt()関数が一般的で、便利ですが、 この方法だと√12を3.46410161513775と返します。 こうではなく、√12を2√3のような形で取得したいのです。 ご存じの方がいましたらご教授よろしくお願いします。

みんなの回答

回答No.5

それはCGIの領域に入るので質問の意図と違ってくるかと思います。 もう私しか見てないようですし、改めてスクリプトを全て載せた上で質問するとよろしいかと思われます。

回答No.4

その警告を出さないようにスクリプトではbinmode STDOUT, ':utf8'をしています。 デフォルトではASCII領域外(Unicode(UTF-8?)の255より大きい文字コード)の文字に遭遇するとその警告が出ます。(√の文字とか) 詳しくはperldoc perldiagの"Wide charater in %s"の部分やperldoc -f binmodeを参照してください。

2hosi2
質問者

補足

素早い解答ありがとうございます。 コマンドプロンプトでその警告が出る件はわかりました。 (まだ出ますが・・・) このスクリプトの最下部のprintの上の行にContent-type: text/htmlを出力させ、それをネット上にアップロードして実行しましたが500エラーです。 ネット上で使うにはどうすればいいのでしょうか。

回答No.3

あれ、てっきりこういうことかと思ってました。 ---------------------------------- root_of(1): root_of(2): √2 root_of(3): √3 root_of(4): 2 root_of(5): √5 root_of(6): √6 root_of(7): √7 root_of(8): 2√2 root_of(9): 3 root_of(10): √10 ---------------------------------- root_of(1)は何も表示されませんので注意。 root_format(primes_of(12)) は { square => 2, root => 3, } を返します。 質問者さんのスクリプトに流用する場合はそちらを使っていただければ。 出力の表示の仕方がそのままでいいならroot_of()でかまいません。 注意点は - 引数は正の整数 - 効率については思いつくままに書いたのであまり考えていない... - 数学の知識に乏しいので用語が間違っているかもしれない... などなど... ---------------------------------- use strict; use warnings; use utf8; # from: 12 # to: (2 => 2, 3 => 1) sub primes_of { my ($int) = @_; my $half = $int / 2; my $i = 2; my %primes; while ($i <= $half) { if ($int % $i == 0) { $primes{$i} = exists $primes{$i} ? $primes{$i} + 1 : 1; $int /= $i; } else { $i++; } } if ($int != 1) { $primes{$int} = exists $primes{$i} ? $primes{$i} + 1 : 1; } %primes; } # from: (2 => 2, 3 => 1) # to: {square => 2, root => 3} sub root_format { my %primes = @_; my ($square, $root) = (1, 1); while (my ($prime, $num) = each %primes) { while ($num >= 2) { $square *= $prime; $num -= 2; } $root *= $prime if $num == 1; } +{square => $square, root => $root}; } # from: 12 # to: "2√3" sub root_of { my ($int) = @_; my $formatted = root_format(primes_of($int)); ($formatted->{square} == 1 ? '' : $formatted->{square}) . ($formatted->{root} == 1 ? '' : '√'.$formatted->{root}); } binmode STDERR, ':utf8'; print "root_of($_): @{[ root_of($_) ]}\n" for 1 .. 10; ----------------------------------

2hosi2
質問者

補足

どのように使用するのでしょうか; コマンドプロンプトでそのまま実行してみたところ、 Wide character in print at C:\root_math.pl line 58. root_of(1): Wide character in print at C:\root_math.pl line 58. root_of(2): √2 Wide character in print at C:\root_math.pl line 58. root_of(3): √3 Wide character in print at C:\root_math.pl line 58. root_of(4): 2 Wide character in print at C:\root_math.pl line 58. root_of(5): √5 Wide character in print at C:\root_math.pl line 58. root_of(6): √6 Wide character in print at C:\root_math.pl line 58. root_of(7): √7 Wide character in print at C:\root_math.pl line 58. root_of(8): 2√2 Wide character in print at C:\root_math.pl line 58. root_of(9): 3 Wide character in print at C:\root_math.pl line 58. root_of(10): √10 のように表示されます。 また、print &root_of(12);と追記した場合は Wide character in print at C:\root_math.pl line 58. 2√3 と表示されます。 浅い知識しかありません; どうすればいいのでしょうか?

回答No.2

>#1 未検証。 Math::Big::Factorsとか使ったりして楽にかけないかなあ? http://search.cpan.org/~tels/Math-Big-1.12/lib/Math/Big/Factors.pm Perlに苦手意識持ってて実行環境整備してないのでメモのみ。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

めんどくせ~. 整数に限定していいなら sub introot { my ($n) = @_; for ($i = int(sqrt($n)); $i > 1; --$i) { return "$i√${[$n/($i*$i)]}" if $n % ($i*$i) == 0; } "√$n"; } でいいかも. ま, 人間がやってることを素直に Perl に直しただけなんだが.

関連するQ&A

専門家に質問してみよう