小程序:或与加

题目描述:

给定 x,k,求满足 x + y = x | y 的第 K 小的正整数 y。 | 是二进制的或(or)运算。例如,3 | 5 = 7.
比如当 x = 5, k = 1时,返回2,因为 5+1 = 6 不等于 5 | 1 = 5,而 5+2 = 7 等于 5 | 2 = 7

输入描述: 每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。满足 0 < x, k <= 2,000,000,000

输出描述:
输出一个数y

分析

关于此题的或与加,仔细看题可以发现,x,k的值很大,不能进行一一对比,需要用位运算的方式,直接计算。例如: 5 + 2 = 5 | 2
即 1001 + 0010 = 1001 | 0010
仔细观察可以发现,符合 x&y = 0,条件的,也符合x + y = x | y。
统计一下 x 中的 0 的位置(yi),然后用int count_comp( int *cur, int count, long int k )
中的计算方法进行计算,求得第K个符合要求的数

代码

/** * @filename Or_Add.cc * @Synopsis output the data y which in accordance with x+y = x|y * @author XIU * @version 1 * @date 2016-05-05 */



#include<iostream>

#include<bitset>

#include<string>

#include<math.h>

#include<cstdlib>

using namespace std;





/* ============================================================================*/

/** * @Synopsis * * @Param cur a array which stores the location of zero in the inputdata * @Param count the number of the zeros * @Param k * * @Returns the result data(y) */

/* ============================================================================*/

int count_comp( int *cur, int count, long int k )

{



    int data = 0;

    bitset<1000> t = k;



    for(int i=0; i<count; i++ )

    {

        data = data + t[i]*pow( 2,cur[i] );

    }



    return data;

}



/* ============================================================================*/

/** * @Synopsis * * @Param x * @Param k * * @Returns the result data(y) */

/* ============================================================================*/

int compute( long int x, long int k )

{

    int count = 0;



    bitset<10000> t;

    t = x;

    //cout<< endl<<t[0] << t[1] <<t[2]<< endl;

    int yi[10000];

    for(long int y =0 ; y<=10000 ; y++)

    {



        if( t[y]==0 )

        {

            yi[count] = y;

            count++;

            if( k < pow(2,count) )

            {



                int data = 0;



                data = count_comp( yi, count ,k );



                return data;

            }

        }



    }



}



int main()

{



    long int x,k;

    int count = 1;

    int *data = (int *)malloc(sizeof(int)*count);

    while( cin>>x>>k )

    {

        if(count > 1) 

        {

            data = (int *)realloc( data,sizeof(int)*( count ) );

        }

        data[count-1] = compute(x,k) ;

        count++;

    }



// cout<<"------------------------"<<endl;

    for(int i=0; i<count-1; i++ )

    {

        cout << data[i] <<endl;

    }



    return 0;

}

你可能感兴趣的:(或与加)