递归-分治 找出伪币的位置

#include<stdio.h>  
#include<stdlib.h>  
#include<time.h>  

static int CalcSum(int* pArray,int StartPos,int EndPos);

static int FakeCoinPos(int* pArray,int length,int StartPos);

int main(void)  
{  
    int ArrayData[24]={4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4};  
    int length=24;
    int* pArrayData=ArrayData;
    int StartPos=0;
    int fakeCoinPos=FakeCoinPos(pArrayData,length,StartPos);
    printf("fakeCoinPos=%d\n",fakeCoinPos);

    // 等待用户输入任意一键返回 ...  
    system( "PAUSE" );  
    return 0;  
}  

static int FakeCoinPos(int* pArray,int length,int StartPos)
{
    if (length%2 ==0)
    {
        int leftStartPos=0;
        int leftEndPos=length/2-1;
        int rightStartPos=length/2;
        int rightEndPos=length-1;
        int leftWeight=CalcSum(pArray,leftStartPos,leftEndPos);
        int rightWeight=CalcSum(pArray,rightStartPos,rightEndPos);
        if (leftWeight<rightWeight)
        {
            int* pArrayData=&pArray[leftStartPos];
            length=leftEndPos-leftStartPos+1;
            int newStartPos=StartPos+leftStartPos;
            if (length==1)
            {
                return StartPos+leftEndPos;
            } 
            else
            {
                return FakeCoinPos(pArrayData,length,newStartPos);
            }
        } 
        else
        {
            int* pArrayData=&pArray[rightStartPos];
            length=rightEndPos-rightStartPos+1;
            int newStartPos=StartPos + rightStartPos;
            if (length==1)
            {
                return StartPos + rightEndPos;
            } 
            else
            {
                return FakeCoinPos(pArrayData,length,newStartPos);
            }
        }
    }
    else
    {
        if (length==1)
        {
            return StartPos+0;
        }
        else
        {
            if (pArray[0]<pArray[1])
            {
                return StartPos+0;;
            } 
            else
            {
                return FakeCoinPos(&pArray[1],length-1,StartPos+1);
            }
        }
    }

}


static  int CalcSum(int* pArray,int StartPos,int EndPos)
{
    int sum=0;
    for (int i=StartPos;i<=EndPos;i++)
    {
        sum += pArray[i];
    }
    return sum;
}

/*
fakeCoinPos=15
请按任意键继续. . .
*/

 

posted @ 2018-01-31 10:35  sky20080101  阅读(47)  评论(0)    收藏  举报