03.购物单
- IT业界
- 2025-09-11 20:33:02

题目:购物单 题目描述
小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。
这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。
取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。
购物单
以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了:
标价(元)折扣180.9088折10.2565折56.149折104.659折100.3088折297.15半价26.7565折130.62半价240.2858折270.628折115.8788折247.3495折73.219折101.00半价79.54半价278.447折199.26半价12.979折166.3078折125.5058折84.989折113.3568折166.57半价42.569折81.9095折131.788折255.8978折109.179折146.6968折139.3365折141.1678折154.748折59.428折85.4468折293.7088折261.7965折11.3088折268.2758折128.2988折251.038折208.3975折128.8875折62.069折225.8775折12.8975折34.2875折62.1658折129.12半价218.37半价289.698折说明
折扣规则:
例如“88折”表示按标价的 88% 计算;“8折”表示按标价的 80% 计算;特别地,“半价”表示按标价的 50% 计算。取款机限制:
取款机只能提供 100元面额的纸币。小明希望尽可能少取些现金,但必须保证金额足够支付购物单上的所有商品。输出要求:
提交的答案是一个整数,单位是元;答案的结尾必然是 00,例如 4300。解题思路
理解问题:
每个商品的实际支付金额 = 标价 × 折扣率;遍历购物单中的所有商品,累加每个商品的实际支付金额,得到总金额;将总金额向上取整到最近的 100 的倍数,以满足取款机的限制。核心步骤:
计算实际支付金额: 遍历购物单中的每个商品,使用公式 标价 × 折扣率 计算每个商品的实际支付金额;将所有商品的实际支付金额累加起来,得到总金额。 向上取整到 100 的倍数: 使用数学函数 ceil() 将总金额除以 100 后向上取整;再乘以 100,确保结果是 100 的倍数。注意事项:
折扣率以小数形式表示,例如“88折”对应 0.88,“半价”对应 0.50;最终结果必须是 100 的倍数,且不能小于总金额。代码实现
以下是完整的 C++ 实现代码,并附有详细注释:
#include <iostream> // 引入输入输出流库 #include <cmath> // 引入数学库,用于向上取整函数 ceil() using namespace std; // 使用标准命名空间,避免每次调用标准库函数时加 std:: int main() { // 定义一个数组,存储每个商品的标价和折扣率 // 每个商品用 pair<double, double> 表示,第一个值是标价,第二个值是折扣率 const pair<double, double> items[] = { {180.90, 0.88}, {10.25, 0.65}, {56.14, 0.90}, {104.65, 0.90}, {100.30, 0.88}, {297.15, 0.50}, {26.75, 0.65}, {130.62, 0.50}, {240.28, 0.58}, {270.62, 0.80}, {115.87, 0.88}, {247.34, 0.95}, {73.21, 0.90}, {101.00, 0.50}, {79.54, 0.50}, {278.44, 0.70}, {199.26, 0.50}, {12.97, 0.90}, {166.30, 0.78}, {125.50, 0.58}, {84.98, 0.90}, {113.35, 0.68}, {166.57, 0.50}, {42.56, 0.90}, {81.90, 0.95}, {131.78, 0.80}, {255.89, 0.78}, {109.17, 0.90}, {146.69, 0.68}, {139.33, 0.65}, {141.16, 0.78}, {154.74, 0.80}, {59.42, 0.80}, {85.44, 0.68}, {293.70, 0.88}, {261.79, 0.65}, {11.30, 0.88}, {268.27, 0.58}, {128.29, 0.88}, {251.03, 0.80}, {208.39, 0.75}, {128.88, 0.75}, {62.06, 0.90}, {225.87, 0.75}, {12.89, 0.75}, {34.28, 0.75}, {62.16, 0.58}, {129.12, 0.50}, {218.37, 0.50}, {289.69, 0.80} }; double total = 0; // 初始化总金额为 0 // 遍历购物单中的每个商品 for (const auto& item : items) { // 计算每个商品的实际支付金额:标价 × 折扣率 total += item.first * item.second; } // 将总金额向上取整到最近的 100 的倍数 // ceil(total / 100) 将总金额除以 100 后向上取整 // 再乘以 100 得到最终结果 cout << int(ceil(total / 100) * 100) << endl; return 0; // 程序正常结束 }代码解释
数据结构:
使用 pair<double, double> 存储每个商品的标价和折扣率。第一个值(item.first)表示标价,第二个值(item.second)表示折扣率。核心逻辑:
遍历购物单中的每个商品,计算其实际支付金额并累加到 total 中。使用 ceil() 函数将总金额向上取整到最近的 100 的倍数。输出结果:
输出结果是一个整数,且必然是 100 的倍数。运行结果
5200
简单版 #include <iostream> #include <vector> using namespace std; int main() { vector<double> prices = {180.90, 10.25, 56.14, 104.65, 100.30, 297.15, 26.75, 130.62, 240.28, 270.62, 115.87, 247.34, 73.21, 101.00, 79.54, 278.44, 199.26, 12.97, 166.30, 125.50, 84.98, 113.35, 166.57, 42.56, 81.90, 131.78, 255.89, 109.17, 146.69, 139.33, 141.16, 154.74, 59.42, 85.44, 293.70, 261.79, 11.30, 268.27, 128.29, 251.03, 208.39, 128.88, 62.06, 225.87, 12.89, 34.28, 62.16, 129.12, 218.37, 289.69}; vector<double> discounts = {0.88, 0.65, 0.90, 0.90, 0.88, 0.50, 0.65, 0.50, 0.58, 0.80, 0.88, 0.95, 0.90, 0.50, 0.50, 0.70, 0.50, 0.90, 0.78, 0.58, 0.90, 0.68, 0.50, 0.90, 0.95, 0.80, 0.78, 0.90, 0.68, 0.65, 0.78, 0.80, 0.80, 0.68, 0.88, 0.65, 0.88, 0.58, 0.88, 0.80, 0.75, 0.75, 0.90, 0.75, 0.75, 0.75, 0.58, 0.50, 0.50, 0.80}; double total = 0; for (int i = 0; i < prices.size(); ++i) { total += prices[i] * discounts[i]; } if(total - (int(total / 100) * 100 ) > 0) { total = (int(total / 100) + 1) * 100; } cout << int(total) << endl; return 0; }上一篇
C#将Box企业网盘里的文件批量上载到S3,并导入Redsh
下一篇
动态内存分配