题目

相传,孙悟空被五指山压了 500 年后大喊一声:猿神,起洞!

唐僧看见孙悟空的一万个分身后说:原来你也万猿身!

在游戏《猿神》中,主角孙悟空原名冰心,浙江周树人,后改名步惊云,恶魔果实能力者。 经过 DNA 电泳分析可得,他统一三国的概率取决于应急食品里 42 号混凝土的质量。 为了不影响挖掘机的扭矩,他利用缩聚反应产生的高能蛋白收集七个葫芦娃在羊村召唤青眼白龙, 终于获得了 Concrete Math 中的相关函数:

 f(x) = x − ⌊x⌋, 2k ≤ x ≤ 2k+1,k ∈ ℤ
 f(x) = ⌊x⌋ − x + 1,2k+1 ≤ x ≤ 2k+2,k ∈ ℤ

孙悟空现在有一个浮点数 x,他找到了已经掌握条件语句的你,让你帮忙求 f(x),以便知道他统一三国的概率。

输入:仅一行,一个浮点数 x,保证 x 仅保留两位小数。
输出:仅一行,为 f(x),保留两位小数后输出。
数据范围:|x| ≤ 10⁹

样例:
输入 0.59 → 输出 0.59
输入 1.73 → 输出 0.27

思路

观察分段条件:当 x 落在 [2k, 2k+1] 时取第一段,落在 [2k+1, 2k+2] 时取第二段。 两段的分界点恰好是整数,所以只需看 ⌊x⌋ 的奇偶性—— 偶数对应第一段奇数对应第二段

frac = x − ⌊x⌋(小数部分),则两段公式分别化简为:

 ⌊x⌋ 为偶数 → f(x) = frac
 ⌊x⌋ 为奇数 → f(x) = 1 − frac

由此,问题变成一个简单的 if-else 分支。唯一需要注意的是: |x| 最大达 10⁹,用 floor() 取整后须存入 long long 而非 int,避免溢出。

C++ · ape_cave.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    double x;
    cin >> x;
    long long fx = (long long)floor(x);  // 用long long,因|x|可达1e9
    double frac = x - fx;
    double ans;
    if(fx % 2 == 0)
        ans = frac;
    else
        ans = 1.0 - frac;
    printf("%.2f\n", ans);
    return 0;
}

复杂度分析

  • 时间复杂度:O(1),单次运算。
  • 空间复杂度:O(1)。
今日感受

首先声明:day000为人工智能所写,不含人工成分。如有错误请email me.
1. 浮点数精度:x 是浮点数,直接用 int 截断会在负数或大数上出错,用 floor() 再转 long long 更安全。
2. 奇偶判断:负数的取模 % 在 C++ 中可能返回负值(如 -1 % 2 == -1),要额外处理

← 返回菜鸟的coding