CF81B Sequence Formatting - 题解

一看题目内容,这道题看似是道模拟,实际上确实是道模拟。


解析

题目中分四种类型:整数、逗号、空格、省略号。我们来分类讨论:

  1. 整数:无需处理,直接塞到 \(s\) 里面就行了。

  2. 逗号:往 \(s\) 里面加一组 , (即一个逗号加一个空格)。

  3. 空格:当两个整数内包含多个空格时,只保留一个。即只有前一个是数字时才加入空格,其它忽略。

  4. 省略号:省略号的处理较为复杂,需要分成每三个一组。我们可以用一个变量表示输入 . 的个数,当其为 \(0\) 时输出 .(空格加点),否则只输出 .;当其达到 \(3\) 时意味着一组省略号已完成,需要将其清零以便下一组省略号(如果有的话)输出空格。

这样做可能产生连续空格,输出时需要再判断一下,连续空格只输出 \(1\) 个。

还有一种特殊情况,输入 1 , 2 时会输出 1 , 2,数字和逗号之间多了一个空格。输出时特判一下就好了。

另外,还有一个注意事项:末尾不能额外输出空格或换行,所以末尾的空格还需要处理一下。

具体实现请看代码注释。

这样,就能正确输出答案了。


代码:

#include<cstdio>
using namespace std;

char s[10005];	//s 储存最终结果,从 s[1] 开始 
int len=0;		//len 表示 s 的长度 

int main()
{
	int dot=0;		//dot 用来表示 . 的个数 
	while(true)
	{
		char ch=getchar();		//输入单个字符 
		if(ch=='\n') break;		//如果输入完成则退出循环 
		if(ch==' ')				//情况 3 
		{
			if(s[len]>='0'&&s[len]<='9')
				s[++len]=' ';
			else continue;
		}
		if(ch>='0'&&ch<='9') 	//情况 1 
			s[++len]=ch;
		if(ch==',') s[++len]=',',s[++len]=' ';	//情况 2 
		if(ch=='.')			//情况 4 
		{
			if(dot==0&&(s[len]!=' '&&len!=0)) s[++len]=' ';
			s[++len]='.';
			dot++;
			if(dot==3) dot=0;
		}
	}
	while(s[len]==' ') len--;		//循环处理字符串末尾字符 
	for(int i=1;i<=len;i++)
	{
		if(s[i]==' '&&s[i-1]==' ') continue;	//判断连续空格 
		if(s[i-1]>='0'&&s[i-1]<='9' && s[i]==' ' && s[i+1]==',')
			continue;		//“数字+空格+逗号”的特殊情况判断 
		putchar(s[i]);
	}
	return 0;
}

\[\large\frak{The\ End} \]


2022-07-28 10:08 撰写于洛谷,2025-08-29 20:31 迁移至博客园。

posted @ 2025-08-29 20:32  Jerrycyx  阅读(14)  评论(0)    收藏  举报