#include<stdio.h>
intmain()
{
chars[50],s1[100]
inti=0,j=0,k,n
gets(s)//输入压缩后的字符串
while(s[i])
{
s1[j]=s[i]
//因为形式是先字符后数字,所以第一个肯定是字符,先赋入另一个数组以便后续操作。
i++j++//递增,开始处理下一位的数字
n=0
while(s[i]>='0'&&s[i]<='9')//只要是数字就要进入循环统计
{
n*=10
n+=s[i]-'0'
i++
}
for(k=0k<n-1k++)
//因为解压缩的字符已经存入数组s1,所以只剩下n-1要再放入s1
s1[j+k]=s1[j-1]
if(n>0)//注意,一定要n>0因为有可能是连续字符,本来就没被压缩这时如果还把j加上n-1就反而是让j减小了。
j+=n-1
}
s1[j]='\0'//处理结束后,最后一个设为空字符结束。
printf("%s\n",s1)
return0
}
扩展资料
稀疏矩阵的压缩存储原理,只存储非零元素ai,j和相应的行、列序号i、j。具体方法:对稀疏矩阵中每一个非零元素设定一个三元组(i,j,ai,j)。
将所有三元组按行优先排列,组成一个三元组表(线性表)。只要存储三元组表和该矩阵的行、列数,就能唯一确定该矩阵。
/*原串: 111225555
压缩后: 312245
原串: 333AAAbbbb
压缩后: 333A4b
原串: ASXDCdddddd
压缩后: 1A1S1X1D1C6d
Press any key to continue
*/ #include <stdio.h>
#include <string.h>
char *CompressStr(char s[]) {
char t[255]
int i = 0,j,k = 0
while(s[i]) {
j = i + 1
while(s[i] == s[j]) ++j
t[k++] = j - i + '0'
t[k++] = s[i]
i = j
}
t[k] = '\0'
strcpy(s,t)
return s
}
int main(void) {
char i,s[][20] = {"111225555","333AAAbbbb","ASXDCdddddd"}
for(i = 0 i < 3 ++i) {
printf("原串: %s\n",s[i])
printf("压缩后: %s\n",CompressStr(s[i]))
}
return 0
}
#include <stdio.h>
void stringZip(const char
*pInputStr, long lInputLen, char *pOutputStr)
{ int n=1
char c,*p1=pInputStr,*p2=pOutputStr
while(*p1)
{
c=*(p1++)
while(*p1==c){n++p1++}
if(n>1)
{
if(n>999){*(p2++)=48+n/1000n/=10}
if(n>99){*(p2++)=48+n/100n/=10}
if(n>9){*(p2++)=48+n/10n/=10}
*(p2++)=48+n
}
*(p2++)=c
n=1
}
*p2='\0'
}
void main()
{ char s1[200],s2[200]
gets(s1)
stringZip(s1,strlen(s1),s2)
puts(s2)
}