购书最低价

/*
题目:
书店针对《哈利波特》系列书籍进行促销活动,一共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本相同卷呢?就不能使用这种算法。首先要看购买的种类,然后配齐几套,把剩下的尽量再配一起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值