【id:273】【33分】C. 字符串碎片(字符串)

该程序是用C语言编写的,用于处理输入的字符串,将其拆分成由相同字符组成的连续片段(碎片),并计算所有碎片的平均长度。程序首先读取测试次数,然后对每个字符串,它会找到连续的字符并记录它们,避免重复输出相同的碎片,最后输出每个字符串的碎片和它们的平均长度。
摘要由CSDN通过智能技术生成

题目描述

一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:"aaa","bb",‘c’。输入字符串,请计算字符串的所有碎片及所有碎片的平均长度。

所有碎片的平均长度 = 所有碎片长度之和/碎片个数

输入

测试次数t
每组测试数据为一行字符串

输出

对每组测试数据,输出字符串中按顺序出现的碎片和所有碎片的平均长度(相同碎片只输出一次,平均长度保留2位小数)。

输入输出样例

输入样例1 <-复制
4
aaabbaaac
szuszuszuszu
aaaaaa
apple

输出样例1
aaa bb c 2.25
s z u 1.00
aaaaaa 6.00
a pp l e 1.25

AC代码

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

int main()
{
	int t;					//t是次数
	int i,j,k,l;			//i,j,k,l用来做数组下标 
	int y,h,q;				//
	double avelong,alllong,geshu;//平均长度,总长度,个数 
	char c;					//c用来判断连续字符是否相等 
	scanf("%d",&t);
	getchar();
	while(t--)
	{		
		char a[1000]={0},b[100][100]={0};
		//a数组存输入数据 ,b数组将a分割后按字符串存入
		int flag[1000];			// flag数组用来标志分割a数组 
		
		memset(flag,0,4000);	//重置数组很重要!!! 
		geshu=0;
		
		gets(a);
		alllong=strlen(a);		//得到总长度 		
		
		c=a[0];	//小细节!!! 
		for(i=0;a[i]!='\0';i++)
		{									//用flag数组标志a数组字符串分割点 
			if(c==a[i])
				continue;
			else
			{
				geshu++;
				c=a[i];
				flag[i-1]=1;//细节:是i-1而不是i 
			}
		}
		
		geshu++;//细节,个数最后还要加一 
		avelong=alllong/geshu;
		
		for(i=0,j=0,k=0;a[i]!='\0';i++)
		{						//分割a数组成字符串存入b数组				
			b[j][k]=a[i];
			k++;
			if(flag[i]==1)	//利用flag数组的标志进行分割 
			{
				b[j][k]='\0';
				j++;
				k=0;
			}
		}
		b[j][k]='\0';//注意补上最后一个(细节!!!) 
		
		for(i=0;i<=j;i++)
		{
		
			for(h=0;h<i;h++)			//此处判断当前字符串是否与前面字符串相等 
				if(strcmp(b[h],b[i])==0)
					y=1;			//注意continue不能放这,注意跳过的是哪一个for循环!!! 
			if(y==1)	
			{					
				y=0;
				continue;
			}
			
			for(l=0;b[i][l]!='\0';l++)
				printf("%c",b[i][l]);
			printf(" ");				
		}	
		printf("%.2lf\n",avelong);			
	}
}

(by 归忆) 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归忆_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值