Это действительно жадный подход, но вам нужно поменять местами порядок if-then-else. В общем, жадный означает потреблять в текущий момент самое большое количество, которое вы можете потреблять.
Вам нужно сначала проверить самую большую монету. Нет необходимости в цикле while.
if(sum>=100) {
hundreds=sum/100;
sum-=hundreds*100;
}
if(sum>=10){
tens=sum/10;
sum-=tens*10;
}
ones = sum;
Вторая часть подстановки - это строка в двойных кавычках, поэтому может произойти любая нормальная интерполяция. Это означает, что вы можете использовать значение захвата для индексации в хеш:
#!/usr/bin/perl
use strict;
use warnings;
my %replace = (
quick => "slow",
lazy => "energetic",
);
my $regex = join "|", keys %replace;
$regex = qr/$regex/;
my $s = "The quick brown fox jumps over the lazy dog";
$s =~ s/($regex)/$replace{$1}/g;
print "$s\n";
Вы можете сделать это в Vim, используя Словарь:
:%s/quick\|lazy/\={'quick':'slow','lazy':'energetic'}[submatch(0)]/g
Это изменит следующий текст:
быстрый бурый лис бежал быстрый рядом с ленивым ручьем.
в :
медленный бурый лис бежал медленно рядом с энергичным ручьем.
Чтобы увидеть, как это работает, см. : help выражение подстановки
и : справочный словарь
. Короче говоря,
\ =
позволяет заменить в результате выражения vim. {'быстрый': 'медленный', 'ленивый': 'энергичный' }
- это словарь vim (например, хеш в perl или ruby или объект в javascript), который использует []
для поиска. submatch (0)
- совпавшая строка Это может пригодиться при рефакторинге кода - допустим, вы хотите обменять имена переменных на foo
, bar
и baz
изменение
foo
→ bar
bar
→ baz
baz
→ foo
Использование последовательность команд % s ///
была бы хитрой, если бы вы не использовали временные имена переменных - но вы должны были бы убедиться, что они не ударяются ни о чем другом. Вместо этого вы можете использовать словарь, чтобы сделать это за один проход:
:%s/\<\%(foo\|bar\|baz\)\>/\={'foo':'bar','bar':'baz','baz':'foo'}[submatch(0)]/g
, который изменяет этот код
int foo = 0;
float bar = pow(2.0, (float) foo);
char baz[256] = {};
sprintf(baz,"2^%d = %f\n", foo, bar);
на:
int bar = 0;
float baz = pow(2.0, (float) bar);
char foo[256] = {};
sprintf(foo,"2^%d = %f\n", bar, baz);
Если вы обнаружите, что делаете это много, вы можете добавить следующее к ~ / .vimrc
:
менее повторяющийся, чем создание регулярного выражения для dict вручную.
Вы можете сделать следующее.
:%s/quick\(.*\)lazy/slow\1energetic
Хитрость заключается в использовании паренсов для сопоставления текста между двумя словами. Затем вы можете сослаться на этот текст в строке подстановки, используя \1
. Вы также можете использовать \2
для второго паренсного выражения и так далее. Это позволит вам заменить несколько слов, не нарушая текст между ними.
Ответ Часа хорош, единственное, что я хотел бы упомянуть, это то, что если вы делаете обмен словами, вы, вероятно, хочу найти соответствие на
\ b (foo | bar | baz | qux) \ b
, чтобы избежать совпадения подстрок. Если вы выполняете много замены слова, вы можете начать находить регулярные выражения с некоторым ограничением и захотите сделать что-то вроде:
join '', map { exists $subst{$_} ? $subst{$_} : $_ } split /\b/, $string
В perl:
s/quick(.*)lazy/slow${1}energetic/;
В vim:
s/quick\(.*\)lazy/slow\1energetic/;
Есть хороший способ сделать это в Ruby, используя gsub с блоком:
s = "The quick brown fox jumps over the lazy dog"
subs = {'quick' => 'slow', 'lazy' => 'industrious'}
s.gsub(/quick|lazy/) { |match| subs[match] }
# => "The slow brown fox jumps over the industrious dog"