1398:短信计费

【题目描述】
用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送的短信的字数,试统计一下你当月短信的总资费。

【输入】
第一行是整数n,表示当月发送短信的总次数,接着n行每行一个整数,表示每次短信的字数。

【输出】
输出一行,当月短信总资费,单位为元,精确到小数点后1位。

【输入样例】
10
39
49
42
61
44
147
42
72
35
46
【输出样例】
1.3

  1. 向上取整机制
    在很多场景下,我们需要将一个数值按照一定的大小进行分组,并且要求分组的数量是向上取整的。例如,假设我们要把一些物品每 70 个分为一组,如果物品总数不能被 70 整除,那么剩下的物品也需要单独成一组。

在数学上,如果要对一个数 x 除以另一个数 y 的结果进行向上取整,可以使用公式 x/y。在 C++ 中,整数除法是向下取整的,为了实现向上取整的效果,可以使用 **(x + y - 1) / y **这个技巧。在这行代码里,y 的值是 70,所以就有 (x + 69) / 70。

#include <iostream>
#include <iomanip>
using namespace std;

void calculate(int n) {
    int x;
    double totalExpense = 0;

    for (int i = 1; i <= n; i++) {
        cin >> x;
        // 计算每条短信需要的短信条数
        int messageCount = (x + 69) / 70;
        // 累加总资费
        totalExpense += messageCount;
    }

    // 输出总资费,精确到小数点后 1 位
    cout << fixed << setprecision(1) << 0.1 * totalExpense;
}

int main() {
    int n;
    cin >> n;
    calculate(n);
    return 0;
}
posted @ 2026-03-09 19:35  Szy111  阅读(53)  评论(0)    收藏  举报