等值首尾和

xxxxxxxxxxx

# -*- coding: cp936 -*-
'''
等值首尾和
假设有一个数组x[],它有n个元素,每一个都大于零;
称x[0]+x[1]+…+x[i]为前置和(Prefix Sum),
而 x[j]+xlj+1]+…+x[n-1]为后置和(Suffix Sum)。
试编写一个程序,求出 x[]中有多少组相同的前置和与后置和。

【说明】
如果x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,
即3,9,11,12, 16,21,23;后置和则是2,7,11,12,14,20,23;
于是11、12与23这3对就是值相同的前置和与后置和, 因为:
	11=3+6+2 (前置和)=2+5+4 (后置和)
	12=3+6+2+1 (前置和)=2+5+4+1 (后置和)
由于23是整个数组元素的和,因此前置和与后置和一定相同。
	当然,也可以用上面的方法把前置和与后置和都先算出来
	(两者都是从小到大的递增 序列,为什么?),再进行比较,
	但建议不要使用这种方法,因为它需要额外的内存。
'''
def ComputCountSumOfHeadOrTail(listX):
    if len(listX)<0:
        return -1

    indexHead=0
    indexTail=len(listX) - 1

    sumOfHead=0
    sumOfTail=0
    count=0

    while( indexHead<len(listX)   and    indexTail > 0):
        if sumOfHead>sumOfTail:
            sumOfTail+=listX[indexTail]
        elif sumOfHead<sumOfTail:
            sumOfHead+=listX[indexHead]
        else:
            count+=1
            indexHead+=1

    print "x[]中有%d组相同的前置和与后置和" %(count)
            
ComputCountSumOfHeadOrTail([3,6,2,1,4,5,2])        
        


xxxxxxxxx

另附c++源码

xxxxxxxxxx

int  head_tail(int  x[], int n)
{
     int  prefix     = 0, suffix     = 0;
     int  prefix_idx = 0, suffix_idx = n-1;
     int  count = 0;

     while (suffix_idx >= 0 && prefix_idx <= n-1)
          if (prefix < suffix)      /* prefix too small   */
               prefix += x[prefix_idx++];
          else if (prefix > suffix) /* suffix too small   */
               suffix += x[suffix_idx--];
          else {                    /* get an equal pair: */
               count++;             /* increase count and */
               prefix += x[prefix_idx++]; /* advance pref.*/
               suffix += x[suffix_idx--]; /* and suffix   */
          }
     return count;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值