分享一个自研算法
  • 板块灌水区
  • 楼主CJR_Rain
  • 当前回复6
  • 已保存回复7
  • 发布时间2025/1/10 21:47
  • 上次更新2025/1/10 22:45:29
查看原帖
分享一个自研算法
1382345
CJR_Rain楼主2025/1/10 21:47
#include <stdio.h>

unsigned long long high = 0xffffffff00000000, low = 0xffffffff;
int ans = 64, cnt = 16;

int main() {
    
    unsigned long long num;
    scanf("%llu",&num);
    
    if(num == 0) {
        
        printf("0");
        return 0;
    }
    
    while(cnt > 0) {
        
        if((num & low) > 0) {
            
            high = low;
            low >>= cnt;
            high -= low;
            
            ans -= cnt << 1;
        }
        
        else {
            
            low = high;
            high <<= cnt;
            low -= high;
        }
        
        cnt >>= 1;
    }
    
    printf("%d",ans -= ((low & num) > 0 ? 1 : 0));
    
    return 0;
}

算法作用:查找64位无符号整数在二进制下的第一个11的位置(例如12(10)=1100(2)12_{(10)}=1100_{(2)},代码将输出33)

实现方法:二分(不太好描述)

时间复杂度:O(log2(k))O(log_{2}(k))kk为输入数字在二进制下的位数(代码输入的是64位无符号整数所以时间复杂度应为O(6)O(6))

2025/1/10 21:47
加载中...