В данном случае достаточно просто идти с конца. Скажем, если есть число 99, очевидно, последней командой было "прибавить 1". Далее, 98 - может быть получено умножением на 2, и следует выбирать именно эту команду - программа точно не будет превосходить по размеру вариант, где последней операцией является сложение. Например, 98 - 49 - 48 короче, чем 98 - 97 - 96 - 48
При работе со строками можно использовать много различных решения задачи. Здесь предлагается в котором применяются только две библиотечных подпрограммы (length и delete). Можно было сделать и без delete, а можно использовать trim, например. Короче говоря, вот такой вариант программы на паскале: var s,s1:string; mn:set of char; i,l:integer; begin writeln('Введите строку:'); readln(s); mn:=['.',',',';',':','!','?']; while s[1]=' ' do delete(s,1,1); while s[length(s)]=' ' do delete(s,length(s),1); while pos(' ',s)>0 do delete(s,pos(' ',s),1); s1:=s[1]; for i:=2 to length(s)-1 do if not((s[i]=' ')and(s[i+1] in mn)) then s1:=s1+s[i]; s1:=s1+s[length(s)]; s:=s1[1]; for i:=2 to length(s1)-1 do if (s1[i] in mn)and(s1[i+1]<>' ') then s:=s+s1[i]+' ' else s:=s+s1[i]; s:=s+s1[length(s1)]; writeln(s); end.
Пример: Введите строку: Дана строка ,состоящая из слов , разделенных пробелами . Дана строка, состоящая из слов, разделенных пробелами.
5: 001 {1 - 2 - 4 - 5}
50: 0100010 {1 - 2 - 3 - 6 - 12 - 24 - 25 - 50}
99: 010000101 {1 - 2 - 3 - 6 - 12 - 24 - 48 - 49 - 98 - 99}
В данном случае достаточно просто идти с конца. Скажем, если есть число 99, очевидно, последней командой было "прибавить 1". Далее, 98 - может быть получено умножением на 2, и следует выбирать именно эту команду - программа точно не будет превосходить по размеру вариант, где последней операцией является сложение.
Например,
98 - 49 - 48 короче, чем
98 - 97 - 96 - 48
var
s,s1:string;
mn:set of char;
i,l:integer;
begin
writeln('Введите строку:');
readln(s);
mn:=['.',',',';',':','!','?'];
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
while pos(' ',s)>0 do delete(s,pos(' ',s),1);
s1:=s[1];
for i:=2 to length(s)-1 do
if not((s[i]=' ')and(s[i+1] in mn)) then s1:=s1+s[i];
s1:=s1+s[length(s)];
s:=s1[1];
for i:=2 to length(s1)-1 do
if (s1[i] in mn)and(s1[i+1]<>' ') then s:=s+s1[i]+' ' else s:=s+s1[i];
s:=s+s1[length(s1)];
writeln(s);
end.
Пример:
Введите строку:
Дана строка ,состоящая из слов , разделенных пробелами .
Дана строка, состоящая из слов, разделенных пробелами.