Как заставить эту программу на Perl печатать в порядке убывания?

#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. @Дэвид Фаррелл, исправлено.