Problem 编程实现对一个只包含大写字母的字符串进行压缩和解压缩。 压缩规则是:假设某连续出现的同一字母的数量为n,则其在压缩字符串中为字母n。若n=1,则n必须省略,例如,AAAABCCCCCDDDD压缩为A4BC5D4。 解压缩规则是将压缩字符串还原,例如,A4BC5D4解压为AAAABCCCCCDDDD。 输入、处理结果中的每个字符串的长度都不会超过99。 字符串库函数可用列表: strlen() 注意:禁用STL。 input: 第一行:数字1或者2,前者代表进行压缩,后者代表进行解压。 第二行:一个符合对应要求的字符串。 output: 处理后的结果。 Samples: input: 1 AAAABCCCCCDDDD output: A4BC5D4 input: 2 A4BC5D4 output: AAAABCCCCCDDDD
#include<stdio.h>
#include <cstring>
#define LENGTH 2000
char a[LENGTH];
void compress_string() {
int i,n=1,l,j;
l=strlen(a);
for(i=0;i<l;i++){
if(a[i]==a[i+1]){
n++;
//printf("%d\n", i);
}
else{
if(n>1)
printf("%c%d", a[i],n);
else
printf("%c", a[i]);
//printf("%d\n", i);
n=1;
}
}
}
void jieya_string() {
int i,n,l,j;
l=strlen(a);
for(i=0;i<l;i++){
if(a[i]>='0'&&a[i]<='9'){
n=a[i]-'0';
for(j=0;j<n-1;j++){
printf("%c", a[i-1]);
}
}
else
printf("%c", a[i]);
}
}
int main(void) {
int i,t=0;
scanf("%d", &t);
scanf("%s", a);
if(t==2)
jieya_string();
else
compress_string();
return 0;
}
#include<stdio.h>
#define LENGTH 2000
char a[LENGTH];
void compress_string() {
int i,n=1,l,j;
l=strlen(a);
for(i=0;i<l;i++){
if(a[i]==a[i+1]){
n++;
//printf("%d\n", i);
}
else{
if(n>1)
printf("%c%d", a[i],n);
else
printf("%c", a[i]);
//printf("%d\n", i);
n=1;
}
}
}
int main(void) {
int i,t=0;
scanf("%s", a);
for(i=0;a[i]!='\0';i++){
if(a[i]>='0'&&a[i]<='9'){
t=1;
break;
}
}
compress_string(a);
return 0;
}
代码如下,如有帮助,请采纳一下,谢谢。
#include <stdio.h>
#include <string>
//字符串压缩
char* StringPress(const char buf[])
{
int len = strlen(buf);
char *p = new char[len+1];
memset(p,0,len+1);
int nmb = 1;
//p[0] = buf[0];
char c = buf[0];
int i = 0;
int indexp = 0;
bool br = true;
while(i < len)
{
if (buf[i] == c)
{
nmb++;
br = true;
}else
{
br = false;
if(nmb > 1)
{
p[indexp] = c;
indexp++;
p[indexp] = nmb + 48;
indexp++;
}else
{
p[indexp] = c;
indexp++;
}
c = buf[i];
//p[indexp] = c;
//indexp++;
nmb = 1;
}
i++;
}
if (br)
{
p[indexp] = c;
indexp++;
p[indexp] = nmb + 48;
}
return p;
}
//字符串解压
char* StringUnPress(const char buf[])
{
int len = strlen(buf);
char* p = new char[100];
memset(p,0,100);
int index = 0;
int i = 0;
for (; i < len-2;)
{
char c = buf[i];
p[index] = c;
index++;
if (buf[i+1] >= 'A' && buf[i+1] <= 'Z')
{
//p[index] = buf[i+1];
//index++;
i+=1;
}else
{
char tmp[4] = {0};
tmp[0] = buf[i+1];
if(buf[i+2] >= '0' && buf[i+2] <= '9')
{
tmp[1] = buf[i+2];
int ds = atoi(tmp);
for (int k = 0; k < ds-1;k++)
{
p[index] = c;
index++;
}
i = i+3;
}else
{
int ds = atoi(tmp);
for (int k = 0; k < ds-1;k++)
{
p[index] = c;
index++;
}
i+=2;
}
}
}
//printf("-->%d,%d",i,len);
if (i == len -2)
{
p[index] = buf[i];
index++;
if (buf[len -1]>= 'A' && buf[len-1] <= 'Z')
{
p[index] = buf[len-1];
}else
{
char tmp[2] = {0};
tmp[0] = buf[len -1];
int ds = atoi(tmp);
for (int k = 0; k < ds -1;k++)
{
p[index] = buf[len -2];
index++;
}
}
}else if (i == len -1)
{
p[index] = buf[i];
index++;
}
return p;
}
int main()
{
int i;
char buf[100]={0};
scanf("%d",&i);
scanf("%s",buf);
if (i == 1)
{
char* pp = StringPress(buf);
printf("%s\n",pp);
delete[] pp;
pp = 0;
}else if (i == 2)
{
char* pp = StringUnPress(buf);
printf("%s\n",pp);
delete[] pp;
pp = 0;
}
getchar();
getchar();
return 0;
}