#t221. 逗号分隔符

逗号分隔符

逗号分隔符

题目背景

Special for beginners, ^_^

题目描述

输入 33 个 doubledouble 类型的数据,请输出最后一个。

输入格式

三个 doubledouble 类型的小数,中间用逗号隔开。

输出格式

输出第三个数,保留小数点后 88 位。

样例输入

1.1231414122,3.2333222222232333,533.1111199999999999922222222223333

样例输出

533.11112000

数据范围

1s, 1024KiB for each test case.

提示

一、scanf 的格式串是「输入模板」

scanf 不只是「读数字」,它是拿格式串去逐字符匹配输入:

  • 格式串里的 %lf、%d 是「这里是数据,读走」;
  • 格式串里的普通字符(逗号、减号、冒号、空格),要求输入里原样出现,匹配上了才跳过。
double a, b;
scanf("%lf,%lf", &a, &b);   // 输入必须是 3.5,4.2 这种带逗号的形式

如果输入是 3.5,4.2,格式串里的逗号正好对上,两个数都读进来。

如果格式串写成 "%lf%lf"(没有逗号),读完 3.5 之后,scanf 期望下一个是数字,但输入里是逗号,匹配失败,第二个变量保持原样(垃圾值)。

二、两种解法,选一种就好

  1. 格式串里如实写出分隔符:输入用逗号隔开,就写 "%lf,%lf"。
  2. 用一个 char 把分隔符读掉:scanf("%lf", &a); scanf("%c", &sep); scanf("%lf", &b);,中间的 , 被 sep 吃掉。

三、%c 的特殊脾气

%c 不会跳过空格和换行(%d、%lf 会自动跳过)。如果输入里有换行,%c 可能读到一个换行符而不是你想要的字符。本题数据是紧凑的,暂时不用管,但要知道这个特性。

四、自检方法

读完后立刻把三个变量打印出来看一眼(printf("%.2f %.2f %.2f\n", a, b, c);)。如果某个数是 0 或者一个奇怪的巨大值,多半是格式串没匹配上。

  • 先看清楚三个数之间隔的是什么符号,再决定格式串里该怎么写。
  • 只用 %lf%lf%lf 会怎样?想一想:读完第一个数后,下一个字符是逗号,%lf 能读它吗?
  • 两种思路选一种:格式串里如实写出分隔符,或用 %c 把分隔符读掉。

自查:只输出第三个数,保留 8 位小数;如果读到 0 或读失败,多半是分隔符没处理。