求oj代码:C语言字符串的问题(代码通过即采纳)

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;
}