题目大致要求:
给定一个字符串,如 aaabbccildf....,让你压缩一下这个字符串,方法是计算每次字符连续出现的次数,若大于1则存该字符出现的次数+该字符,若等于1
则只存该字符,如上面的解答为:3a2b2cildf...,用C语言编写这个程序
我的程序:
#include "stdio.h"
#include "string.h"
int main(){
char str[1000],comprise[1000]; //str为源字符串,comprise为压缩的字符串
scanf("%s", str);
int i,j = 0,times = 0,len = strlen(str);
char temp = '#', math[32];
for(i = 0;i < len;i++){ // 遍历整个字符串
//当当前的字符与上一个字符temp不同时或者其下一个字符时结束符'\0'时
//开始进行对数字的处理
//处理方式是先把次数times如果大于0,则处理数字,将数字存入字符串,
//需要注意的是大于10的数得用多位来存,所以有一个取余后除以10的做法
if(str[i] != temp || str[i + 1] == '\0'){
if(times != 0){ //等于0则表示没有统计过字符,即刚开始
if(times == 1){
comprise[j] = temp;
times = 0;
j++;
} else if(times > 1){
int k = 0;
while(times != 0){ //这里将times的每一位分离,但存的时候是从0开始的
math[k] = times % 10 + '0';
times = times / 10;
k++;
}
for(k = k - 1;k>=0;k--){//需把数字倒过来
comprise[j] = math[k];
j++;
}
comprise[j] = temp;
j++;
}
}
temp = str[i]; //将当前字符存起来,以供与下一个字符比较
times++;//因为本次就不同,应该加一
} else {
times++;
}
}
comprise[j] = '\0';//最后结束压缩的字符串
printf("The orgin string: %s\n", str);
printf("The comprised string: %s\n", comprise);
return 0;
注意:这里得考虑当次数大于9的时候,应该将数字分离为单个数字,存入压缩的字符串