集合Gk表示这样一堆数字,该集合内的数字有k个1

数字集合定位与索引
本文介绍了一种算法,用于确定一个给定数字所属的特定集合Gk,并计算该数字在其集合中的位置索引。集合Gk包含具有相同数量1的二进制表示的整数。通过实际代码示例展示了如何实现这一过程。

问题描述

集合Gk表示这样一堆数字,该集合内的数字有k个1。比如,G1 = { 1, 10, 100, 1000, ...} G2 = {11, 110, 1110 }, ... , Gk { ... }
给定一个数字,找出该数属于哪一个集合,并且返回该数在集合中的下标。

输入:6 = 110
输出:2  

代码实例

#include <stdio.h>
#include <limits.h>

long rankInGk(long n)
{
        long index = -1;
        long num1 = 0;
        
                long np = n;

        while(np) {
            num1++;
            np = np & (np - 1);
        }
    
                printf("%ld\n", num1);

        long i;
        for (i = 0; i < LONG_MAX; i++) {
            long numm1 = 0;

                   long icp = i;

            while (icp) {
                numm1++;
                icp = icp & (icp - 1);
            }

            if (numm1 == num1) {
                index++;

                if (i == n){
                    return index;
                }
            }

        }

        return index;

}

int main(int argc, char *argv[])
{
    long res;
    long _n;

        scanf("%ld", &_n);

    res = rankInGk(_n);
    printf("res:%ld\n", res);

    return 0;
}

转载于:https://www.cnblogs.com/dennis-wong/p/9180642.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值