Разбить отдельные числа, подсчитать встречаемость и процент возврата каждого - PullRequest
0 голосов
/ 13 октября 2018

Я хотел бы разделить пользовательский ввод чисел и разделить числа на список в perl и вернуть их количество и проценты, отсортированные по разбитым числам:

Например, пользовательские вводы в stdin: 112219992221474774

Число 1 равно 4 с 22,22%

Число 2 равно 5 с 27,77%

Число 4 равно 3 с 16,67%

Число 7 равно 3 с 16,67%

Num 9 3 с 16,67%

Что я сделал до сих пор?

use strict;
use warnings;

sub main {

    print ("Enter the numbers: ");
    chomp(my $num = <STDIN>);

    my @Array = split (//, $num);

    my %numbers;
    $numbers{$_}++ for split / /, $Array[0];

    my $total;

    while (my ($k, $v) = each %numbers){
        $total += $v;
        print "Num $k are $v with $v/$total %\n";   
    }

}

main();

Когда я запускаю это, я получаю:

Число 1 равно 1 с 1/1%

Любая подсказка, почему это так?

1 Ответ

0 голосов
/ 13 октября 2018

Вы правильно разбили входную строку, используя пустую строку //, что возвращает список символов в этой строке;в этом случае цифры вам нужны.Зачем тогда снова делить первый элемент @Array на пробел?Это приводит к тому, что %numbers будет (1 => 1).

Поскольку split // вернул список цифр, просто посчитайте их.

use warnings;
use strict;
use feature 'say';

while (1) {
    print "Enter the number: ";

    my $num = <STDIN>;
    chomp $num;
    if ($num =~ /[^0-9]/) {
        say "Non-digit(s) in input $num. Please try again.";
        next;
    }

    my @digits = split //, $num;   #/

    my %freq;
    ++$freq{$_} for @digits;

    for (sort keys %freq) { 
        say "Num are $freq{$_} with ", (sprintf "%.2f%%", ($freq{$_}/@digits)*100) 
    }
}

Выйдите с помощью Ctrl-C.При вводе 112219992221474774 вывод

Num 1 are 4 with 22.22%
Num 2 are 5 with 27.78%
Num 4 are 3 with 16.67%
Num 7 are 3 with 16.67%
Num 9 are 3 with 16.67%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...