C程序-PAT-1078 字符串压缩与解压

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba

解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc

本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

输入格式:

输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。

输出格式:

根据要求压缩或解压字符串,并在一行中输出结果。

输入样例 1:

C
TTTTThhiiiis isssss a   tesssst CAaaa as

输出样例 1:

5T2h4is i5s a3 te4st CA3a as

输入样例 2:

D
5T2h4is i5s a3 te4st CA3a as10Z

输出样例 2:

TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

思路分析:压缩时,先统计连续相同的字符有几个,然后输出,需要注意单个字符时不用输出整数;解压缩时,先查找整数,并取出整数,然后输出,需要注意的是单个字符前面没有整数

#include <iostream>
#include <stdio.h>
#include <string.h>

const int N=1024;

int compress(char *s,int len);//压缩函数 
int decompression(char *s,int len);//解压函数 

int main( ) 
{
	char str[N],ch;
	int n;
	
	scanf("%c",&ch);
	getchar();//接收回车 
	fgets(str,N,stdin);//接收字符串,包括空格 
	int len=strlen(str);//字符串长度 
	
	if(ch=='C')
		compress(str,len);
	else if(ch=='D')
		decompression(str,len);

	return 0;
}

int compress(char *s,int len)
{
	int i,j;
	for(i=0;i<len;i=i+j)//越过i+j个字符 
	{
		for(j=0;s[i]==s[i+j];j++);//相同字符个数 
		if(j>1)//个数大于1输出个数 
			printf("%d",j);
		printf("%c",s[i]);//打印字符	
	}
	return 0;
}

int decompression(char *s,int len)
{
	int i,j,n;
	for(i=0;i<len;i++)
	{
		n=0;
		for(;s[i]>='0'&&s[i]<='9';i++)//字符中出现数字时 
			n=n*10+s[i]-'0';//字符个数 
		for(j=0;j<n;j++)
			printf("%c",s[i]);//打印字符 
		if(!n)
			printf("%c",s[i]);//单个字符 
	}
	return 0;	
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值