题解:CF727B Bill Total Value

一道字符串模拟题

总体分为两部分:读入和输出

输入

首先读入整个字符串,因为没有空格,所以可以 scanf

scanf("%s",s);

依次扫描整个字符串

字母只起到分隔数字的作用,所以如果遇到非数字,直接跳过

if(s[i]<'0'||s[i]>'9') continue;

否则开始累计这个数,先把它当作整数来计算

可以参考快读的计算方式,每一次令 \(x=10x+ch-'0'\)

int x=0;
while(i<len && ((s[i]>='0'&&s[i]<='9') || s[i]=='.'))
{
  x=(x<<3)+(x<<1)+(s[i]^'0'); //等价于 x=x*10+s[i]-'0'; 
  i++;
}

再计数的时候标记是否有 . 符号,并统计最后一个 . 后数字的数量

int x=0,cnt=0; bool have_dot=false;
while(i<len && ((s[i]>='0'&&s[i]<='9') || s[i]=='.'))
{
  if(s[i]=='.')
  {
    have_dot=true;
    cnt=0,i++;
    continue;
  }
  x=(x<<3)+(x<<1)+(s[i]^'0'); //等价于 x=x*10+s[i]-'0'; 
  cnt++,i++;
}

然后判断这个数是整数还是分数,如果有 . 并且其数量为 \(2\),代表最后为 .xx 的形式,那么这个数为小数,需要 /=100.0 后累加,否则直接作为整数累加到答案内。

if(have_dot&&cnt==2) ans+=(double)x/100.0;
else ans+=x;

输出

首先分离整数和小数部分,并把小数部分存为整数(注意四舍五入)

int inter=(int)ans;
int dec=(ans-inter+0.005)*100.0;

把整数部分的每一数位存到一个数组里面(此时存入的数位是倒序的)

while(inter)
{
	num[++numcnt]=inter%10;
	inter/=10;
}

倒序输出整数部分,如果 \((i-1) \bmod 3=0\),此时应该输出一个 .(注意避免最后多一个 .,需要特判)

for(int i=numcnt;i>=1;i--)
{
  printf("%d",num[i]);
  if((i-1)%3==0 && i!=1) putchar('.');
}

若没有整数部分,即 \(ans<1\),这时需要补充一个 \(0\)(在上面补充应该也行)

if(ans<1) putchar('0');

如果有小数部分则输出小数部分

如果小数部分不到 \(0.1\),还需在前面补一个 \(0\)

if(dec>=10) printf(".%d\n",dec);
else if(dec) printf(".0%d\n",dec);

完整 AC 代码

#include<cstdio>
#include<cstring>
using namespace std;
char s[1005];
int main()
{
	scanf("%s",s);
	int len=strlen(s);
	double ans=0;
	for(int i=0;i<len;i++)
	{
		if(s[i]<'0'||s[i]>'9') continue;
		int x=0,cnt=0; bool have_dot=false;
		while(i<len && ((s[i]>='0'&&s[i]<='9') || s[i]=='.'))
		{
			if(s[i]=='.')
			{
				have_dot=true;
				cnt=0,i++;
				continue;
			}
			x=(x<<3)+(x<<1)+(s[i]^'0'); //等价于 x=x*10+s[i]-'0'; 
			cnt++,i++;
		}
		if(have_dot&&cnt==2) ans+=(double)x/100.0;
		else ans+=x;
	}
	int inter=(int)ans;
	int dec=(ans-inter+0.005)*100.0;
	int num[15],numcnt=0;
	while(inter)
	{
		num[++numcnt]=inter%10;
		inter/=10;
	}
	for(int i=numcnt;i>=1;i--)
	{
		printf("%d",num[i]);
		if((i-1)%3==0 && i!=1) putchar('.');
	}
	if(ans<1) putchar('0');
	if(dec>=10) printf(".%d\n",dec);
	else if(dec) printf(".0%d\n",dec);
	return 0;
}

2024-08-08 21:53 撰写于洛谷,2025-08-29 20:49 迁移至博客园。

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