0

アームストロングの数値を印刷するためにforループまたはループを使用してロジックを作成する方法は?while

アームストロングの数字を 1 から 1,00,00,000 まで出力する方法を誰か親切に説明してください。

これは私が従ったアルゴリズムです

step 1 : initializing variable min,max,n,sum,r,t
step 2 : my $n = <>;
step 3 : to find base of $n
step 4 : using for loop 
        ( for (n = min; n < max ; n++ )
step 5 : some logic like 
        n=t,sum =0,r=t%10,t=n/10,
step 6 : 
        sum = sum + (n ^ base );
step 6 : 
        if ( sum == num ) print Armstrong numbers else not.

これをコード化しようとしました私のコードは次のようになります

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $n;
chomp($n);

my $min = 1;
my $max = 10000000
my $r;
my $sum;
my $t;

my $base = length($n);
print "base is $base\n";

for ($n = $min; $n <= $max; $n++) {
  $t = $n;
  $sum = 0;
  while ($t != 0) {
    $r = $t % 10;
    $t = $t / 10;
    {
      $sum = $sum + ($base * $r);
    }
    if ($sum == $n) {
      print "$n\n";
    }
  }
}
4

3 に答える 3

0

あなたのコードは正しいようですが、開始時に何らかの問題があります。たとえば、からSTDINまたはから読み取ることはありません@ARGV。そうしますか、指数計算の計算に小さな問題があります。ほとんどのプログラミング言語では、指数計算の構文は**orpow()関数です。この部分が何であるかについて、私は本当に理解していません:

while ($t != 0) {
    $r = $t % 10;
    $t = $t / 10;
    {
      $sum = $sum + ($base * $r);
    }
    if ($sum == $n) {
      print "$n\n";
    }
}

裸のブロックは何のためにあるのですか?なぜモジュラスを使用するのですか?.. さて1..100、0 から 1000 万の間の を基数とするアームストロング数を計算するための小さなコードを提供します。

#!/usr/bin/perl
use strict;
use warnings;
foreach my $base (0..100) {               # use the foreach loop as base
  for my $num (0..10_000_000) {           # and use numbers between this range
    my $ce=0;                             # ce = calculated exp.
    foreach my $num2 (split //,$num ) {   # split each number for calc each
      $ce += $num2 ** $base;              # exp. and adding it (see algorithm)
    }
    if ($num == $ce) {                    # when the exp. num and the number
      print "$base => $num\n";            # itself equals, its a armstrong number
    }                                     # print that
  }
}
于 2013-08-07T17:44:52.920 に答える