/*
题目:
书店针对《哈利波特》系列书籍进行促销活动,一共5卷,
用编号0、1、2、3、4表示,单独一卷售价8元,
具体折扣如下所示:
本数 折扣
2 5%
3 10%
4 20%
5 25%
根据购买的卷数以及本数,会对应不同折扣规则情况。
单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,
则可以享受5%的折扣,另外一本卷一则不享受优惠。
设计算法能够计算出读者购买一批书的最低价格。
*/
/*
设计思路:假设一本1元
购买数量 购买方式及价格
1 1
2 2×(1-5%)=1.9 √
3 3×(1-10%)
6 5×(1-25%)+1=4.75 √
4×(1-20%)+2×(1-5%)=5.1
3×(1-10%)×2=5.4
7 5×(1-25%)+2×(1-5%)=5.65 √
4×(1-20%)+3×(1-10%)=5.9
8 5×(1-25%)+3×(1-10%)=6.45
4×(1-20%)×2=6.4√
9 5×(1-25%)+4×(1-20%)=6.95 √
10 5×(1-25%)×2=7.5 √
由上述可以看出1-5本的时候就按折扣来就行
在6-10本的时候,问题就出在8本上,其他的都是5+?的买法,只有8本的时候是4+4的买法
购买数量dividend÷5=consult余remainder 购买方式5×(1-25%)×consult+remainder×(1-z)
s z
0 100%
1 0%
2 5%
3 10%
4 20%
5 25%
8 20% ×2
*/
#include<iostream>
#include<cmath>
using namespace std;
double Buy(int dividend)
{
double sum, z;
int consult, remainder;
consult = dividend / 10;
remainder = dividend % 10;
if (remainder==8) //如果余数为8,用这种办法计算
{
sum = (5 * (1 - 0.25) * ((double)consult * 2) + 4 * (1 - 0.2) * 2)*8;
}
else //如果余数是其他则用这种办法
{
consult = dividend / 5;
remainder = dividend % 5;
switch (remainder)
{
case 0:z = 1; break;
case 1:z = 0; break;
case 2:z = 0.05; break;
case 3:z = 0.1; break;
case 4:z = 0.2; break;
}
sum = (5 * (1 - 0.25)*(double)consult + (double)remainder*(1 - z))*8;
}
return sum;
}
void main()
{
int dividend;
double sum;
while (1)
{
cout << "请输入购书数量:";
cin >> dividend;
sum = Buy(dividend);
cout << "最低价格为:" << sum << endl;
}
}
本题是针对购买的书肯定是1-5卷的倍数,然后再加1或1,2或1,2,3或1,2,3,4卷。如果是买10本相同卷呢?就不能使用这种算法。首先要看购买的种类,然后配齐几套,把剩下的尽量再配一起。