计算书费(信息学奥赛一本通-T1104)

本文介绍了一个简单的图书总价计算程序,该程序可以根据用户输入的不同图书数量,计算出购买多种图书的总费用。

【题目描述】

下面是一个图书的单价表:

计算概论 28.9元/本
数据结构与算法 32.7元/本
数字逻辑 45.6元/本
C++程序设计教程 78元/本
人工智能 35 元/本
计算机体系结构 86.2元/本
编译原理 27.8元/本
操作系统 43元/本
计算机网络 56元/本
JAVA程序设计 65元/本

给定每种图书购买的数量,编程计算应付的总费用。

【输入】

输入一行,包含10个整数(大于等于0,小于等于100),分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》的数量(以本为单位)。每两个整数用一个空格分开。

【输出】

输出一行,包含一个浮点数f,表示应付的总费用。精确到小数点后一位。

【输入样例】

1 5 8 10 5 1 1 2 3 4

【输出样例】

2410.2

【源程序】

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    double price[10]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65};//给定每种书的价格
    int num[10];
    double sum=0;
    int i;
    
    for(i=0;i<10;i++)
    {
        cin>>num[i];//输入要买的每本书的数量
        sum+=num[i]*price[i];//累加每种书的价格
    }
    printf("%.1f\n",sum);//保留1位小数输出
    
    return 0;
}

 

<think>嗯,我现在要解决信息学奥赛一本里的1104题,题目是计算书。那我得先仔细看一下题目要求。题目可能给出每本书的价格和购买的数量,然后计算总用。不过具体题目内容可能有些细节需要注意,比如输入输出的格式,或者是否有其他特殊情况。 首先,我需要回忆类似的题目结构。比如,可能给出n种书的价格,然后输入每种书的数量,计算总金额。例如,每本书的单价是固定的,然后输入各个数量,相乘后累加总和。这种情况下,我应该先确定每种书的单价,然后读取数量,逐个相乘相加。 假设题目中的书价是给定的,比如有10种书,每种的价格可能是一个固定的列表。例如,可能像这样:第一本书28.9元,第二本32.7元等等。那正确的做法应该是将这些单价存储在一个数组中,然后读取每个数量,依次相乘,最后总和起来。 那接下来,我需要考虑输入的方式。题目可能要求输入多个测试用例,或者只输入一组数据。比如,输入的第一行是购买的数量,然后接下来每个数代表对应书的数量。或者可能是一次输入10个整数,分别代表每本书的数量。例如,输入一行10个数字,每个数字对应数量,然后计算总和。 比如,样例输入可能是这样的:输入10个整数,如1 2 3 4 5 6 7 8 9 10,然后输出总用。这个时候,我需要将这些数分别乘以对应的单价,然后加起来。 那具体步骤应该是: 1. 确定每本书的单价列表。可能题目已经给出具体数值。比如,信息学奥赛的题目可能有固定的价格表,例如: 书的价格数组可能是这样的:28.9, 32.7, 45.6, 78, 35, 86.2, 27.8, 43, 56, 65。这个可能需要确认题目中的具体价格,可能我记错了,但关键是按照题目给定的单价来计算。 假设题目给出的单价是正确的,我需要先定义这个数组。 2. 读取输入的数量。比如,输入的是10个整数,用空格分隔。需要将这些数读入到一个列表中。 3. 遍历这两个数组(单价和数量),将对应的元素相乘,然后累加到总和中。 4. 最后输出总和,保留一位小数或者两位小数,根据题目要求。 那现在需要处理的问题可能有: - 单价可能有小数,所以在计算时需要用浮点数处理。 - 输入的每个数量是整数,所以相乘的时候注意类型转换,可能需要将数量转换为浮点数或者直接用整数相乘,因为单价可能有小数。 - 输出的精度,题目可能要求保留一位小数,比如样例输出是“3442.1”这样的形式,所以需要用格式化输出。 例如,在Python中,可以用sum函数结合列表推导式,然后使用round或者格式化字符串来控制小数位数。 现在,我需要考虑具体的代码结构。 比如,在Python中: 首先定义价格数组: prices = [28.9, 32.7, 45.6, 78, 35, 86.2, 27.8, 43, 56, 65] 然后读取输入的数量。假设输入是一行,10个整数,例如: quantities = list(map(int, input().split())) 然后计算总和: total = 0 for i in range(10): total += prices[i] * quantities[i] 或者更简洁的方式: total = sum(p * q for p, q in zip(prices, quantities)) 然后输出,格式化为保留一位小数: print("{:.1f}".format(total)) 那这样的代码应该可以解决问题。但需要确认题目中的价格是否正确。例如,我之前假设的价格是否正确?比如,可能题目中的价格是: 根据信息学奥赛一本中的题目,可能正确的价格列表是: 第一到第十本书的价格依次是:28.9元、32.7元、45.6元、78元、35元、86.2元、27.8元、43元、56元、65元。这需要确认,如果题目中有明确给出的话。 例如,可能正确的价格列表是: 比如,假设题目给出的价格是这样的: 书的价格列表: 28.9 32.7 45.6 78 35 86.2 27.8 43 56 65 那这样的话,代码中的prices数组应该正确。 那现在,整个代码的大致结构就完成了。需要注意输入是否正确,是否有足够的数量。比如,输入的10个数是否对应每一本书的数量。 然后,测试样例。比如,题目中的样例输入可能给出: 样例输入: 1 2 3 4 5 6 7 8 9 10 那总用的计算是: 1×28.9 + 2×32.7 +3×45.6 +4×78 +5×35 +6×86.2 +7×27.8 +8×43 +9×56 +10×65 计算每个部分: 1×28.9=28.9 2×32.7=65.4 → 累计 94.3 3×45.6=136.8 → 累计231.1 4×78=312 → 543.1 5×35=175 → 718.1 6×86.2=517.2 → 718.1+517.2=1235.3 7×27.8=194.6 → 1235.3+194.6=1429.9 8×43=344 → 1429.9+344=1773.9 9×56=504 → 1773.9+504=2277.9 10×65=650 → 2277.9+650=2927.9 → 但总金额可能四舍五入到一位小数。例如,如果是2927.9的话,输出就是2927.9,但是根据题目中的样例是否正确? 或者可能原题的样例输入不同,或者价格不同。比如,比如原题中的正确价格可能不同,所以必须严格按照题目给出的价格。 例如,可能正确的价格列表是: 比如,可能价格是: 第1本:28.9元,第2本:32.7元,第3本:45.6元,第4本:78元,第5本:35元,第6本:86.2元,第7本:27.8元,第8本:43元,第9本:56元,第10本:65元。这应该是对的。 那假设用户输入的测试案例是正确的,那么代码应该可以正确计算。 那现在,我需要考虑如何处理输入的读取。例如,在Python中,输入一行,分割成10个数,转换为整数列表。 然后,和价格列表相乘相加。然后输出结果。 例如,代码: prices = [28.9, 32.7, 45.6, 78, 35, 86.2, 27.8, 43, 56, 65] quantities = list(map(int, input().split())) total = sum(p * q for p, q in zip(prices, quantities)) print("{:.1f}".format(total)) 这样是否可行? 假设输入正确,且每个数量都是非负整数,那么这段代码应该可以正确运行。 比如,假设样例输入是: 1 5 8 10 5 1 1 2 3 4 那计算各乘积相加,然后输出正确结果。 那现在,可能需要注意浮点数的精度问题。例如,在计算时,使用浮点数累加可能会有微小的误差,但在保留一位小数的情况下,常不会有问题。例如,当总和为123.45时,四舍五入到一位小数是123.5,而如果是123.449999,则保留一位小数是123.4。但题目中的测试数据可能设计成总和刚好是精确到一位小数的情况。 所以,这样的代码应该是正确的。 总结:这道题的解决方法是,将已知的每种书的价格存入数组,然后读取对应的数量数组,对应相乘累加,最后按格式输出。</think>要解决《信息学奥赛一本1104题“计算书”,可以按照以下步骤进行: ### 题目分析 题目要求根据给定的每本书价格和购买数量,计算总用。已知10本书的单价,输入对应的数量后,求总金额。 ### 解决思路 1. **存储单价**:将10本书的固定价格存入数组。 2. **读取输入**:获取表示每本书购买数量的10个整数。 3. **计算总价**:将每个数量与对应单价相乘,累加得到总和。 4. **格式化输出**:结果保留1位小数。 ### 代码实现 ```python prices = [28.9, 32.7, 45.6, 78, 35, 86.2, 27.8, 43, 56, 65] quantities = list(map(int, input().split())) total = sum(p * q for p, q in zip(prices, quantities)) print("{:.1f}".format(total)) ``` ### 关键点说明 - **单价数组**:题目中10本书的单价固定,直接硬编码到数组中。 - **输入处理**:过 `input().split()` 读取一行输入并转为整数列表。 - **总价计算**:使用生成器表达式和 `sum` 函数快速累加各乘积。 - **格式化输出**:用 `format` 保留1位小数,符合题目要求。 这种方法简洁高效,时间复杂度为 $O(1)$(固定10次循环),适用于所有合法输入。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值