#perl #while-loop #integer
#perl #цикл while #целое число
Вопрос:
Этот код работает, но он печатается в порядке возрастания. Нужно ли мне менять всю мою формулу?
print "Enter an integer n";
my $root = <STDIN>;
my @nums = (100..200);
my $i = 0;
# code in while loop executes as long as condition is true
while ( $i < $#nums )
{
print "$nums[$i]n",if($nums[$i] % $root == 0); $i ;
}
Ответ №1:
Просто установите $i
значение $#nums
вместо 0
и уменьшите его --
вместо увеличения. Вам нужно будет изменить условие цикла на $i >= 0
(оно должно быть $i <= $#nums
в вашем коде, иначе оно пропускается 200
при 10
вводе).
#!/usr/bin/perl
use warnings;
use strict;
print "Enter an integer n";
my $root = <>;
my @nums = (100 .. 200);
my $i = $#nums;
while ( $i >= 0 ) {
print "$nums[$i]n" if $nums[$i] % $root == 0;
--$i;
}
Комментарии:
1. это не работает. Я изменился
$i > $#nums
$i > 99
, и это тоже не работает.
Ответ №2:
Существует более нескольких способов сделать это… не все одинаково хороши:
#!/usr/bin/env perl
use strict;
use warnings;
run(@ARGV);
sub run {
my $root = $_[0] // get_root();
my @nums = (100 .. 200);
my @functions = (
sub {
my ($root, $nums) = @_;
my $i = @$nums;
while ($i--) {
print "$nums->[$i]n" unless $nums->[$i] % $root;
}
return;
},
sub {
my ($root, $nums) = @_;
for my $n ( reverse @$nums ) {
print "$nn" unless $n % $root;
}
return;
},
sub {
my ($root, $nums) = @_;
my $i;
while ($i < @$nums) {
print "$nums->[@$nums - $i]n" unless $nums->[@$nums - $i] % $root;
}
return;
},
sub {
my ($root, $nums) = @_;
my @multiples = reverse grep !($_ % $root), @$nums;
print "$_n" for @multiples;
return;
},
);
for my $i ( 0 ... $#functions ) {
print "=== Function $i ===n";
$functions[$i]->($root, @nums);
}
}
sub get_root {
return scalar <STDIN>;
}
Ответ №3:
print "Enter an integer n";
my $root = <STDIN>;
my @nums = (100..200);
@nums = reverse @nums; #Just reverse the arrays
my $i = 0;
# code in while loop executes as long as condition is true
while ( $i < $#nums )
{
print "$nums[$i]n",if($nums[$i] % $root == 0); $i ;
}
Может быть, это вам поможет.
Комментарии:
1. О господи, я все это время возился с реверсом, и это все упростило. Большое спасибо!
Ответ №4:
for (my $i = $#nums; $i >= 0; --$i) { ... }
for (my $i = @nums; $i--; ) { ... }
for my $i (reverse 0 .. $#nums) { ... }
for (1 .. @nums) { my $i = -$_; ... } # Or: my $i = @nums-$_;
for my $num (reverse @nums) { ... }
Комментарии:
1. с/почитать/обратить вспять/ ?
2. @Дэвид Фаррелл, исправлено.