游程编码

游程编码_第1张图片

#include


#include 
int main()
{
	char input[128];
	while(~scanf("%s",input))
	{
		char output[128];
		memset(output,'\0',sizeof(output));
		int p=0;
		char now=input[p];
		int count=0;
		while(input[p]!='\0')
		{
			while(input[p]==now)
			{
				p++;
				count++;
			}
			char tmp[2],tmp2[128];
			tmp[0]=now;
			tmp[1]='\0';
			sprintf(tmp2,"%d",count);
			strcat(tmp2,tmp);
			strcat(output,tmp2);
			now=input[p];
			count=0;
		}
		printf("%s\n",output);
	}
	return 0;
}

不会阿阿阿阿阿为什么


同学写的1 参考

#include
int main()
{
	int i;
	char temp;
	char sum[26] = { 0 };
	for (i = 0; i < 100; i++)
	{
		temp = getchar();
		if (temp != '\n')
		{
			if ((temp >= 'a' && temp <= 'z') || (temp >= 'A' && temp <= 'Z'))
			{
				switch (temp)
				{
				case 'a':case 'A':sum[0]++; break;
				case 'b':case 'B':sum[1]++; break;
				case 'c':case 'C':sum[2]++; break;
				case 'd':case 'D':sum[3]++; break;
				case 'e':case 'E':sum[4]++; break;
				case 'f':case 'F':sum[5]++; break;
				case 'g':case 'G':sum[6]++; break;
				case 'h':case 'H':sum[7]++; break;
				case 'i':case 'I':sum[8]++; break;
				case 'j':case 'J':sum[9]++; break;
				case 'k':case 'K':sum[10]++; break;
				case 'l':case 'L':sum[11]++; break;
				case 'm':case 'M':sum[12]++; break;
				case 'n':case 'N':sum[13]++; break;
				case 'o':case 'O':sum[14]++; break;
				case 'p':case 'P':sum[15]++; break;
				case 'q':case 'Q':sum[16]++; break;
				case 'r':case 'R':sum[17]++; break;
				case 's':case 'S':sum[18]++; break;
				case 't':case 'T':sum[19]++; break;
				case 'u':case 'U':sum[20]++; break;
				case 'v':case 'V':sum[21]++; break;
				case 'w':case 'W':sum[22]++; break;
				case 'x':case 'X':sum[23]++; break;
				case 'y':case 'Y':sum[24]++; break;
				case 'z':case 'Z':sum[25]++; break;
				}
			}
		}
		else
		{
			break;
		}

	}

	for (i = 0; i < 26; i++) 
	{
		if (sum[i] != 0)
		{
			printf("%c%d ", 'a'+ i, sum[i]);
		}
	}

}

同学写的2 参考


#include

int main()
{
	int i, j, k = 0;
	char temp;
	char sum[100][2] = { 0 };
	for (i = 0; i < 100; i++)
	{
		temp = getchar();
		if (temp != '\n')	//回车
		{
			for (j = k; j < 100; j++)
			{

				if (sum[j][0] == temp)	//temp和sum字母一样的 直接break 
				{
					break; //跳出到sum[j][i]++;来计数
				}
				if (sum[j][0] == 0)		//遇到新的字母
				{	
					sum[j][0] = temp;
					k = j;				//防止重复计数旧的字母
					break;
				}
			}
			sum[j][1]++;		//存数字
		}

		else
		{
			break;
		}
	}
	for (i = 0; i < 26; i++)
	{
		if (sum[i][1] != 0)
		{
			printf("%d%c", sum[i][1],sum[i][0] );
		}
	}

}

//aaba =>2a1b1a

#include

int main()
{
	int i, j;
	char temp;
	char sum[26][2] = { 0 };
	for (i = 0; i < 100; i++)
	{
		temp = getchar();
		if (temp != '\n')	//回车
		{
			for (j = 0; j < 26; j++)
			{

				if (sum[j][0] == temp)	//temp和sum字母一样的 直接break 
				{
					break; //跳出到sum[j][i]++;来计数
				}
				if (sum[j][0] == 0)		//遇到新的字母
				{	
					sum[j][0] = temp;
					break;
				}
			}
			sum[j][1]++;		//存数字
		}

		else
		{
			break;
		}
	}
	for (i = 0; i < 26; i++)
	{
		if (sum[i][1] != 0)
		{
			printf("%d%c", sum[i][1],sum[i][0] );
		}
	}

}
//aaba => 3a1b
#include 
#include
#include
int main()
{
	char s[100], c, l;
	int len, i, count;
	gets(s);		//gets只有遇到\n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入。
	len = strlen(s);
	count = 1;
	l = s[0];
	for (i = 1; i <= len; i++) {
		c = s[i];
		if (c == l) {	//当存在c的字符和l的字符是一样的,就计数+1
			count++;
		}
		else {		//c和l的字符不一样,就输出计数之前有多少个同一字符
			printf("%d%c", count, l);
			count = 1;	//count重新从1开始
		}
		l = c;	//l是这一轮最后一个字符  来验证是否与下一个字符相同
	}
	printf("\n");
	return 0;
}

//gets(s)函数
//例如输入abc 12345 89按回车
//如果用gets(s)接收,字符数组s将保存abc 12345 89\0
//而用scanf("%s", s)接收, 字符数组s将保存abc\0.
//这说明gets遇到回车才停止接收,而scanf("%s")碰到空白符停止接收

详细解答

#include
int main()
{
	int i, j, k = 0;
	char temp;
	char sum[100][2] = { 0 };
	for (i = 0; i < 100; i++)
	{
		temp = getchar();               
		if (temp != '\n') 
		{
			for (j = k; j < 100; j++)    //for(j = 0;j < 100;j++)如果是这种循环,j每次都会遍历一遍数组。如果输入的是aaba
			{							 //temp得到第一个a,发现不是回车,就继续往下执行
										 //j从0开始循环,发现sum[0][0]== 0,于是就把temp的值赋给sum[0][0],结束循环,sum[0][1]+1;
				if (sum[j][0] == temp)   //第二个a,j从0开始循环,发现sum[0][0] == temp,结束循环,sum[0][1]+1;
				{                        //第一个b,j从0开始循环,发现sum[1][0] == 0,,于是就把temp的值赋给sum[1][0] 结束循环,sum[1][1]+1;
					break;               //第三个a,j从0开始循环,发现sum[0][0] == temp,结束循环,sum[0][1]+1;
				}                        //最后结果是3a1b;
				 if (sum[j][0] == 0)      
			    {                        //
					sum[j][0] = temp;    //
					k = j;               //k = j 抽象点来说就是让这个循环只和上一个temp的字母进行比较,而不是和所有的。
					break;               //具体点的话:
				}                        //第一次运行k初始值为0,j从k(0)开始循环,发现sum[0][0]== 0,就把temp的值赋给sum[0][0],执行k=j=0,结束循环,sum[0][1]+1;
			}                            //第二个a,这时候j=k=0,j从0开始循环,发现sum[0][0] == temp,结束循环,sum[0][1]+1;
			sum[j][1]++;                 //第一个b,这时候j=k=0,j从0开始循环,发现sum[1][0] == 0,,于是就把temp的值赋给sum[1][0],执行k=j=1,结束循环,sum[1][1]+1;
		}                                //第三个a,这时候j=k=1,j从1开始循环,跳过了sum[0][0],因为sum[1][0]==b,既不满足==temp也不满足==0,进行下一次循环
		else                             //j = 2, 发现sum[2][0] == 0,,于是就把temp的值赋给sum[2][0],执行k=j=2,结束循环,sum[2][1]+1;
		{                                //假如之后还有输入,j就从2开始循环。
			break;
		}
	}
	for (i = 0; i < 100; i++) 
	{
		if (sum[i][1] != 0)
		{
			printf("%c%d ", sum[i][0], sum[i][1]);
		}
	}

}

你可能感兴趣的:(游程编码)