2016-10-21 11 views
3

数値の階乗を計算するプログラムを作成しようとしています。私はあまりperlに精通していないので、私はいくつかの文法ルールがないと思う。perl - 1の長い文字列を返す短い階乗計算器

私が5を入力すると、プログラムは120を返します。代わりに、数十の1を返します。私が他の数字を試してみると、私はまだ1を取得しますが、より高いまたはより低い数字を入力するかどうかに応じて、より多くまたはより少なくなります。

は、ここに私のコードです:

print"enter a positive # more than 0: \n"; 

$num = <STDIN>; 
$fact = 1; 

while($num>1) 
(
    $fact = $fact x $num; 
    $num = $num - 1; 
) 

print $fact; 
system("pause"); 

これは、スタックオーバーフローの私の最初の投稿ですので、私は私がすべてのthepostingのルールに従っ願っています。

+0

Factorialは実際にはゼロ(0!= 1)に定義されているため、代わりに非負の数値を求める必要があります。 – ikegami

答えて

5

問題は、この行です:

$fact = $fact x $num; 

xはPerlで乗算演算子ではありません。それは物事を繰り返すために使用されます。 1 x 5"11111"を生成します。

代わりに*が必要です。

$fact = $fact * $num; 

*=を使用して書き込むことができます。

$fact *= $num; 

他のいくつかの問題...

Get used to strict and warnings now。デフォルトでは、Perlは宣言せずに変数を使用できるようにします。彼らはグローバルであり、あなたが後で学ぶ理由のために悪いです。今のところ、$faceのような変数名にタイプミスがあると、Perlはそれについて話しません。

range using ..を超えるループで数字のリストをループするのが良いでしょう。forループ。

# Loop from 1 to $num setting $factor each time. 
for my $factor (1..$num) { 
    $fact *= $factor; 
} 

システムコールを使用してプログラムを一時停止する代わりに、sleepを使用してください。

+0

休止は睡眠とは異なります。https://technet.microsoft.com /en-us/library/cc732683(v=ws.11).aspx – ysth

+0

@ysthうん。私が本当に考えていることは、Windowsはプログラム終了時にウィンドウをすぐに閉じる傾向があることです。私はこれを防ぐためにバリエーションを見てきました。 1つは ''を使用して、ユーザーがenterキーを押すまで待ち​​ます。 – Schwern

+1

また、元のプログラムは 'print $ fact'の代わりに' print length $ fact'というべきである点を除いて完全に正しいものでした。 (冗談だ) – ysth

関連する問題