信息学奥赛一本通C++语言-----1104:计算书费

【题目描述】

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

计算概论 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

【输出样例】

2140.2

【代码】

#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
#define N 11
double book[N]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65};
int a[N]={0};
int main()
{
	for(int i=0;i<10;i++)
	{
		cin>>a[i];
	}
	double s=0.0;
	for(int i=0;i<10;i++)
	{
		s+=a[i]*book[i];
	}
	printf("%.1lf",s);
	return 0;
}

【做题链接】

信息学奥赛一本通(C++版)在线评测系统icon-default.png?t=M1H3http://ybt.ssoier.cn:8088/problem_show.php?pid=1104

<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.932.745.6783586.227.8、43、5665。这需要确认,如果题目中有明确给出的话。 例如,可能正确的价格列是: 比如,假设题目给出的价格是这样的: 书的价格列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.2718.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次循环),适用于所有合法输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值