電子書籍の厳選無料作品が豊富!

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

ご存じの方がいましたらご教授よろしくお願いします。

A 回答 (5件)

それはCGIの領域に入るので質問の意図と違ってくるかと思います。


もう私しか見てないようですし、改めてスクリプトを全て載せた上で質問するとよろしいかと思われます。
    • good
    • 0

その警告を出さないようにスクリプトではbinmode STDOUT, ':utf8'をしています。


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

この回答への補足

素早い解答ありがとうございます。
コマンドプロンプトでその警告が出る件はわかりました。
(まだ出ますが・・・)

このスクリプトの最下部のprintの上の行にContent-type: text/htmlを出力させ、それをネット上にアップロードして実行しましたが500エラーです。

ネット上で使うにはどうすればいいのでしょうか。

補足日時:2009/09/20 21:26
    • good
    • 0

あれ、てっきりこういうことかと思ってました。



----------------------------------
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;

----------------------------------

この回答への補足

どのように使用するのでしょうか;
コマンドプロンプトでそのまま実行してみたところ、
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

と表示されます。
浅い知識しかありません;
どうすればいいのでしょうか?

補足日時:2009/09/20 17:54
    • good
    • 0

>#1


未検証。
Math::Big::Factorsとか使ったりして楽にかけないかなあ?
http://search.cpan.org/~tels/Math-Big-1.12/lib/M …

Perlに苦手意識持ってて実行環境整備してないのでメモのみ。
    • good
    • 0

めんどくせ~.


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!