0%

A4解题报告

字符串加密(jiami)

【问题描述】TOM找到了一份为一些文件的某些部分加密的工作,加密的部分是一串小写英文字母,加密的规则是这样的:要是连续出现相同的字母,则把他们替换成这个字母的大写形式,后面紧跟相同字母的个数,并把它之前跟之后的两段字串调换,例如出现bcaaaaaaef则新字符串变成:efA6bc。然后从新扫描字串,直到没有出现相同小写字母为止。

【输入格式】
文件只有一行数据:原始字符串。

【输出格式】
文件只有一行数据:新字符串。

【输入样例1】
bcaaaaaaef

【输出样例1】
efA6bc

【输入样例2】
cmmmcefffg

【输出样例2】
gM3cF3ce

2011-12-27 星期六

前不久,做了字符串第四题,说实在的,挺难的,做了我差不多三节课呢!

初看,不太懂,再看,原来就三个内容:

  1. 要是连续出现相同的字母,则把他们替换成这个字母的大写形式,后面紧跟相同字母的个数;

  2. 并把它之前跟之后的两段字串调换;

  3. 然后从新扫描字串,直到没有出现相同小写字母为止。

那么我就想到了用两个过程和一个函数进行实现,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
procedure zmbsz(ch:char; var mun:integer);
var
wz:integer;
stt:string;

begin
wz:=pos(ch,st);
st[wz]:=upcase(ch);
str(mun,stt);
insert(stt,st,wz+1);
delete(st,wz+length(stt)+1,mun-1);
mun:=length(stt)+1;
end;//NO.1

procedure jh(q,h:string);
var
newst:string;

begin
newst:=h+copy(st,pp,mun)+q;
st:=newst;
end;//NO.2

function pd(str:string):boolean;
var
i,j:integer;
yes:boolean;

begin
yes:=true;
for i:=1 to length(str)-1 do
for j:=i+1 to length(str) do
// 原来是没有的,后来发现是检查是否有相同连续小写字母,把连续给忘了。

if (st[i]=st[j]) and ((st[i]>='a') and (st[i]<='z')) and ((st[j]>='a') and (st[j]<='z')) and (st[j]=st[i+1]) then yes:=false;

pd:=yes;
end;//NO.3

// 一开始,也不知道咋的,老是出现死循环,一看,原来是检查字符串时,if语句出现错误,看!

// 接着就是主程序的问题了,运行时竟然有错!
begin
readln(st);
repeat
ing:=false;
mun:=0;

for i:=1 to length(st) do
begin
// 记得是在找连续字母时出错的。
if st[i]=st[i+1] then
if not(ing) then
begin
// 分了两个内容,一个是找到开头的第一个字母,二是找连续的数目。
ing:=true;
pp:=i;
//这是连续字母结束时做的:
mun:=2;
end
else mun:=mun+1;

if ing and not(st[i]=st[i+1]) then
begin
zmbsz(st[pp],mun);
jh(copy(st,1,pp-1),copy(st,pp+mun,length(st)-length(copy(st,1,pp-1))-mun));

(*问题主要在这里:
1. 一大串函数,看得烦人,容易出错。
2. 再提取中间时,(棕色的),似乎少加了个括号,以及逻辑不清晰,pp和mun的关系没弄好。*)

break;
end;
end;
until pd(st);

writeln(st);
end.

终于好了,我也高兴了。

Thank you so much.