本题描述了一个等差数列模型:红军长征每日行军里程为:
需要计算两个值:
输入中 x, y 是实数(可能含小数),n 是整数。输出要求保留两位小数。
等差数列的核心公式:
通项公式:( a_n = a_1 + (n-1) \times d )
对应本题:第 n 天里程 = ( x + (n-1) \times y )
前 n 项和公式:( S_n = \dfrac{n \times (a_1 + a_n)}{2} )
对应本题:总里程 = ( \dfrac{n \times (x + 第n天里程)}{2} )
由于 x、y 可能为小数,运算时使用浮点数类型(double)。
注意精度:直接使用 double 进行运算足够,输出时使用 fixed 和 setprecision(2) 控制保留两位小数。
可能的边界情况:
nth_day = x + (n-1) * y。total = n * (x + nth_day) / 2.0。n * (x + nth_day) / 2,否则若 n 为奇数、和为奇数时,整型除法会截断小数。写成 2.0 或强制转换为 double 即可。cout << fixed << setprecision(2) << nth_day << " " << total << endl;。整个算法只有常数次运算与一次输入输出,因此时间复杂度为 (O(1)),空间复杂度 (O(1)),可以在 1ms 内轻松完成。
cpp1#include <iostream> 2#include <iomanip> // 包含 setprecision 3 4using namespace std; 5 6int main() { 7 // 关闭 C 风格 I/O 的同步,加快读入速度 8 ios_base::sync_with_stdio(false); 9 cin.tie(NULL); 10 11 double x, y; 12 int n; 13 14 // 读取输入:第一天里程、每日增加里程、天数 15 if (cin >> x >> y >> n) { 16 // 1. 计算第 n 天的行军里程(等差数列第 n 项) 17 double nth_day = x + (n - 1) * y; 18 19 // 2. 计算前 n 天累计总里程(等差数列前 n 项和) 20 double total_sum = n * (x + nth_day) / 2.0; 21 22 // 输出结果,fixed 使小数始终显示,setprecision(2) 保留两位小数 23 cout << fixed << setprecision(2) << nth_day << " " << total_sum << endl; 24 } 25 26 return 0; 27}
<iomanip>:提供 setprecision 用于控制输出小数位数。ios_base::sync_with_stdio(false):解除 C++ 输入输出流与 C 标准输入输出的绑定,提高大数据量时的效率(本题数据量小,但属于良好习惯)。cin.tie(NULL):解除 cin 和 cout 的绑定,进一步加快速度。nth_day = x + (n-1) * y 直接使用通项公式。total_sum = n * (x + nth_day) / 2.0 使用求和公式,分母 2.0 保证浮点除法。fixed 强制以小数形式输出,setprecision(2) 设定保留两位小数。本题属于简单数学模拟题,核心是等差数列通项与求和公式的直接应用。需要注意实数运算和输出格式的控制,避免精度损失或格式错误。