分值算法

分值算法‘’、、、、、、、、、、、、、、、、、、、16枚硬币问题   代码、

分治法是将16个硬币分成8      8 个,判断这两个8个硬币的总重量哪个轻,再分治法轻的那8个 ,调用fund_false函数实现

用到了递归原理、

    #include<iostream>  
    using namespace std;  
    /**************定义查找硬币的函数find_false()**********************/  
    int find_false(int a[],int low,int high)  
    {  
        int i=0;                        //作为遍历的计数器   
        int re=0;                       //re作为返回值  
        int sum1,sum2,sum3;         //三个用来累加的变量  
        sum1=sum2=sum3=0;  
        if(low+1==high)             //当遍历到最后两个元素的时候   16数中 low 是8  high是9 low+1=high是分开   哈哈哈
        {  
            if(a[low]<a[high])  
            {  
                re=low;  
                return re;  
            }  
            else  
            {  
                re=high;  
                return re;  
            }  
        }   
        if((high-low+1)%2==0)               //当长度为偶数的时候  154
        {  
            for(i=low;i<=low+(high-low+1)/2-1;i++)   //对前半段求和   
            {  
                sum1+=a[i];  
            }  
            for(i=low+(high-low+1)/2;i<=high;i++)    //对后半段求和   
            {  
                sum2+=a[i];  
            }  
            if(sum1<sum2)                //假币在前半段   
            {  
                re=find_false(a,low,low+(high-low+1)/2-1);  
                return re;  
            }  
            else if(sum2<sum1)           //假币在后半段     
            {  
                re=find_false(a,low+(high-low+1)/2,high);      //调用回去 
                return re;    
            }     
        }  
        else                        //当长度为奇数的时候   
        {  
            for(i=low;i<=low+(high-low)/2-1;i++) //对前半段求和  
            {  
                sum1+=a[i];  
            }  
            for(i=low+(high-low)/2+1;i<=high;i++)//对后半段求和  
            {  
                sum2+=a[i];  
            }  
            sum3=a[low+(high-low)/2];           //sum3用于存放中间数据   
            if(sum1<sum2)                    //假币在前半段   
            {  
                re=find_false(a,low,low+(high-low)/2-1);  
                return re;   
            }  
            else if(sum2>sum1)  
            {  
                re=find_false(a,low+(high-low)/2,high);  
                return re;  
            }  
            else if(sum1+sum3==sum2+sum3)   //中间的那个就是假币!  
            {  
                re=(high-low)/2+1;  
                return re;  
            }   
        }   
    }   
    int main()  
    {  
        int a[100];  
        int n,i,re;  
        cout<<"请输入硬币的个数:";  
        cin>>n;  
        cout<<"请分别输入这个"<<n<<"个硬币的重量:"<<endl;  
        for(i=1;i<=n;i++)  
        {  
            cin>>a[i];      
        }  
        re=find_false(a,1,n);  
        cout<<"假币是第"<<re<<"硬币"<<endl;  
        return 0;     
    }  


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值