#P1004. 主观人生长度

主观人生长度

Background

你是否曾感觉:童年漫长如史诗,而成年后时间却如白驹过隙?
这并非错觉——心理学研究表明,人对时间的主观感受与已活过的年龄成反比
这就是著名的“对数时间感知模型”:一年对你而言有多“长”,取决于你已经活了多少年。

5岁时,1年是你生命的1/5,无比漫长;
50岁时,1年只是你生命的1/50,转瞬即逝。

因此,若以主观体验衡量人生进度,人生并非线性流逝,而是对数式压缩的。
有俗语云:“18岁是人生的中点”——这正是基于从3岁起形成记忆、寿命100岁的对数模型推导出的经验结论!


Description

给定你的出生年、月、日,请计算截至当前系统日期,你的主观人生已经过去了百分之几。

我们采用如下模型:

  • 假设人类寿命为100岁;
  • 3岁之前无清晰时间感知,主观人生从3岁生日开始计算;
  • 主观人生进度 y y 与当前年龄 x x (单位:年,带小数)的关系为:$$y = \frac{\ln(x / 3)}{\ln(100 / 3)} \quad (3 < x < 100)$$
  • x3 x \leq 3 ,则 y=0 y = 0
  • x100 x \geq 100 ,则 y=1 y = 1

请输出 y×100% y \times 100\% ,保留两位小数,格式如 50.00%


Format

Input

一行,三个整数 birth_year birth_month birth_day,表示你的出生日期。
保证输入为合法公历日期(如不会出现2月30日),且不晚于当前系统日期。

Output

一行,一个字符串,表示主观人生已过百分比,保留两位小数,末尾带百分号 %
例如:51.10%


Samples

2008 1 16
51.10%

样例说明:假设今天是2026年1月16日,则你正好18岁。
代入公式:

$$y = \frac{\ln(18 / 3)}{\ln(100 / 3)} = \frac{\ln 6}{\ln(100/3)} \approx \frac{1.7918}{3.5066} \approx 0.5110$$

故输出 51.10%

2023 5 1
0.00%

样例说明:若今天是2026年1月16日,你尚未满3岁,主观人生尚未开始。

1920 1 1
100.00%

样例说明:年龄已超100岁,主观人生已结束。


Limitation

时间限制:1秒,内存限制:128MB。
程序需在运行时获取真实系统当前日期,不得使用固定日期。

Hint

本题已配置Special Judge,输出答案与标准答案相差不超过0.01%就可以获得Accepted。

下面是 带详细注释的 C++ 示例代码,专门展示如何获取当前系统的年、月、日:

#include <iostream>
#include <ctime>      // 必须包含此头文件才能使用时间函数

int main() {
    // 1. 获取当前时间的时间戳(从1970年1月1日0点至今的秒数)
    std::time_t now = std::time(nullptr);

    // 2. 将时间戳转换为本地时间结构体(struct tm)
    //    localtime 函数会根据你电脑的时区自动调整
    std::tm* localTime = std::localtime(&now);

    // 3. 从 struct tm 中提取年、月、日,并转换为常规格式
    //    注意:tm_year 是从 1900 年开始算的,所以要加 1900
    int currentYear = localTime->tm_year + 1900;

    //    注意:tm_mon 的范围是 0~11(0 表示一月),所以要加 1
    int currentMonth = localTime->tm_mon + 1;

    //    tm_mday 已经是 1~31,直接使用即可
    int currentDay = localTime->tm_mday;

    // 4. 输出当前日期(可选,用于调试)
    std::cout << "当前日期: " << currentYear << "-"
              << (currentMonth < 10 ? "0" : "") << currentMonth << "-"
              << (currentDay < 10 ? "0" : "") << currentDay << std::endl;

    return 0;
}


在 C++ 中,自然对数(ln) 使用标准库函数 std::log() 计算。


✅ 用法说明

#include <cmath>  // 必须包含此头文件

double x = 6.0;
double ln_x = std::log(x);  // ln(6) ≈ 1.791759

🔔 注意:

  • std::log()自然对数(以 e 为底),即数学中的 ln
  • 不是 log10(常用对数,以 10 为底);
  • 不是 log2(以 2 为底)。

📌 常见对数函数对比(都在 <cmath> 中)

函数 含义 数学符号
std::log(x) 自然对数 lnx\ln x
std::log10(x) 常用对数 log10x\log_{10} x
std::log2(x) 二进制对数 log2x\log_2 x