Python数轴分界、定位法实现级差分佣

为什么要写这篇文章

问题来源:网友求助

今天刚好收到一位网友的问题求助,让我帮忙实现一个级差分佣的算法。

因为之前我写过一篇文章 小程序后端开发之《PHP级差分佣系统功能》

这位网友认真的看了我这篇文章,而又恰好最近他在开发关于级差分佣的功能。所以就到我博客主页来提问了。就是大概这么个经过。

问题的描述:九级订单分佣

如果还有不了解什么是级差分佣的请点上面链接,看下我写的那篇文章。
我先把这位网友同学的问题大致描述下吧。

他开发的级差佣金分佣系统也是按每日订单的数量来分级返佣,所以佣金也是根据订单级别来设置的。只不过他开发的是Python程序。

下面是佣金分佣级别,以及每个级别的订单数量和具体佣金金额。

级别订单数佣金
一级1-1000.5元
二级101-3000.8元
三级301-6001.1元
四级601-10001.3元
五级1001-20001.5元
六级2001-50001.7元
七级5001-100001.8元
八级10001-200001.9
九级20000以上2元

问题注意点及要求

1.比如某人的订单数是200,那么他的佣金是100*0.5+100*0.8=130元。
2.用python来实现

他想要达到的结果

向函数里传入一个当日某人的订单数,来计算应该给他分多少佣金。

问题分析:数轴定位分析

这个问题确实和我写的文章有点类似
但也不是完全一样:因为从他的例子中可以看出,当一个人的订单数是200单时,0-100的订单是以0.5元/单来计算,而101-300的订单是按0.8元/单来计算的。
下面我们开始来用数轴分界和定位法分析,并用python代码来实现。

实现代码:Python实现

哪这个问题要怎么写代码呢?
首先我们定义一个函数differential(),并利用input向这个函数中传入当日订单数;

def differential(i):

n = int(input('当日订单数:'))
differential(n)

下面我们来实现这个函数里的功能:
我们先把等级所需的订单数设置为数组arr,作为分界数轴,方便后面来定位。

arr = [20000,10000,5000,2000,1000,600,300,100,0]

接下来把每个级别的佣金也用数组rat存入。

rat = [2,1.9,1.8,1.7,1.5,1.3,1.1,0.8,0.5]

可能有同学要问为什么arr rat 两个数组是倒序存入的。至于为什么是倒序。
这是因为接下来我们要用一个for 来从高级别向底级别定位,这样就可以实现数轴分界及定位分析。

举个例:

有某个人的当日订单数是200单,那我们怎么分析呢,是不是先判断这个200是在那个等级区间中,我们发现他在100-300这个区间,这时我们是不是开始计算在100-300这个区间应该分佣多少。
是不是200-100=100单,这样就可以算得这个区间的分佣为100*0.8=80元,而为什么是减100呢,是不是这100又是在区间0-100里面。然后根据这个区间来判断,这时我们是不是又可以算得0-100这个区间分佣金额为100*0.5=50元。这样我们就得到了总分佣为80+50=130元,所以我们是倒序定位分界数轴的,也就是先判断高级别,再判断低级别,现在应该明白了吧。

下面来看看这个for 要怎么写;
我们的分界数轴长度是9,所以我们要定位9次才能定位完所有级别。

for idx in range(0,9):

同时我们设置r 来接收最后累计的分佣金额。
接下来我们通过if来判断输入的值是不是在某个级别的区间上限外。

if i>arr[idx]:

如果是的话,我们开始计算在这个区间中的佣金。

r+=(i-arr[idx])*rat[idx]

为了看到过程,我们打印下。

print ((i-arr[idx])*rat[idx],i)

接下来是把输入的值往下个级别倒退,所以我们把arr[idx] 赋值给i

i=arr[idx]

最后把总佣金通过return 返回。

下面是整个代码:

#!/usr/bin/python3
 
def differential(i):
    arr = [20000,10000,5000,2000,1000,600,300,100,0]
    rat = [2,1.9,1.8,1.7,1.5,1.3,1.1,0.8,0.5]
    r = 0
    for idx in range(0,9):
        if i>arr[idx]:
            r+=(i-arr[idx])*rat[idx]
            print ((i-arr[idx])*rat[idx],i)
            i=arr[idx]
    return r
 
n = int(input('当日订单数:'))
differential(n)

结果输出:过程结果打印

上面的代码运行后将输出如下结果:

首页会要求输入当日订单数:比如输入200
 
当月订单数:200
    80.0 200
    50.0 100
    130.0

也就是说:0-100的订单是以0.5元一单结算,佣金为50元,101-300之间的订单是以0.8元一单结算,佣金是80,最后总佣金为130。

问题总结:举一反三

其实我们不难看出,这类问题都是通过数轴来进行分界的,然后我们定位到相应的分界数轴里面,就可以实现这类的算法。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huidaoli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值