比如要开20W元发票,但目前只有千元发票,现要求开的900以上的发票张数占60%,800-899发票张数占20%,700-799发票张数占10%,600-699发票张数占5%,500-599发票张数占2%,400-499发票张数占1%,300-399发票张数占1%,200-299发票张数占1%。要生成这类发票,算法如何写?发票面额如900以上 800-899等都是随机生成,在范围之内,不能用固定的800或900等。

解决方案 »

  1.   

    1、确定发票数,可以从界面录入(例如100X)
    2、从小值到大值取随机数200-299一X,300-399一X,400-499一X, 500-599两X
    600-699五个,700-799十X,800-899二十X
    3、Y = 算出剩余钱数/60X,M = 900 + 2*(Y-900)
    4、900到M取30个随机数,小于Y的就再取一个对应大于Y的值
    (如Y=1000,M=1100)其中一随机数999小于Y,则再去对称值1001,这样30X对刚好
      

  2.   

    xiaoxiao197821(你的笑对我很重要) 
    发票数也是由系统自动确定的,不能手工输入的
      

  3.   

    yangmanyuan(蓝天白云) 
    是说我吗?
      

  4.   

    littlefishli(凉水塞牙~) 
     确实 这个百分比是可以有一点误差的 但也是有一定条件才可以的,如果发票总共只开3000还是5000的 是不可能有这个百分比例的
      

  5.   

    设发票数为X
    以每类发票的最大额-50元或40元为上限,根据百分比计算每类发票的张数,余额随机分配到每类发票中
    OKOKOKOKOKOKOK !!
      

  6.   

    我用在公司空闲的时间大概想了一个算法。有点仓卒,可能算法会有问题。如果想进一步考虑在qq上和我联系吧14250050
    ok,下面是算法:
    前提:能够完成生成某一段的随机数(例如,900-990,800-899等)而且这些数都是整数。
    思想:按照现有发票张数的比例动态分配下一张发票应该在的区间。分配的方法是按照发票的权重来分配发票的优先权。
    流程如下:循环判断:总额不超过规定总额。循环体:用一个数组记录每一个段的发票的数量,另一个字段记录每一张发票的面额,首先由第一个数组判断最高权重的发票段(900-990段)的张数在总发票数里占的比例是否达到了规定比例,达到了就计算下一个段的发票组的比例。如果当前段的发票张数没有达到规定的比例,那么就分配下一张发票在此发票段,随机生成一张发票,记录进发票的数组,然后当前段的发票数+1,结束当前循环。如果到最后一个段都达到规定的比例(这个情况每100次循环发生一次)那么下一张发票就分配在权重最重的发票段。如此平衡又被打破,循环继续。直到总额超过规定总额。
    结束循环的处理:最后一张发票取消,剩下的缺口金额是在1-990之间,这个就判断处理一下就ok了,200-990的话就直接分配最后一张了,如果是1-199的话,就把600-699的最后一张发票取出来加上这个差额就行了。
    这样分配少于1000张发票可能产生的张数上的误差都会比较大,但是1000张以上应该问题就不大了,毕竟张数与规定比例的张数最多就差2张,就算最少的1%的200-299段的发票,这种情况下也有10张以上,这么2张的误差应该可以接受了。如果有具体要求再商量。
    不才只能想到这么多了。有问题达人给斧正。
      

  7.   

    littlefishli(凉水塞牙~) 
    我现在的想法和这个有点出入 我的想法是 如果总额够开100张以上 就100张100张的开 不足100张是 用你的这个方法
      

  8.   

    littlefishli(凉水塞牙~) 
    只要总金额大于91260  就可开100张呀