题解: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 迁移至博客园。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19065160

浙公网安备 33010602011771号