用C语言实现计算128位整数四次方根的代码

以下是用C语言实现计算128位整数四次方根的代码,采用二分查找法并使用GCC/Clang的128位整数扩展:

#include 
#include 

// 定义128位无符号整数类型(GCC/Clang扩展)
typedef unsigned __int128 uint128_t;

/**
 * @brief 计算128位整数的四次方根(向下取整)
 * @param x 输入的128位无符号整数
 * @return 四次方根的整数部分(64位无符号整数)
 */
uint64_t fourth_root(uint128_t x)
{
    if (x == 0) return 0;  // 特殊情况处理
    
    uint64_t low = 0;
    uint64_t high = 0xFFFFFFFF;  // 2^32 - 1(四次方最大值边界)
    uint64_t best = 0;
    
    while (low <= high) {
        uint64_t mid = low + (high - low) / 2;
        uint128_t mid_sq = (uint128_t)mid * mid;
        uint128_t mid_fourth = mid_sq * mid_sq;
        
        if (mid_fourth == x) {
            return mid;  // 找到精确解
        } else if (mid_fourth < x) {
            best = mid;   // 当前候选解
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return best;
}

int main()
{
    // 测试用例1:16的四次方根=2
    uint128_t x1 = 16;
    printf("sqrt4(16) = %lu\n", fourth_root(x1));  // 输出2
    
    // 测试用例2:81的四次方根=3
    uint128_t x2 = 81;
    printf("sqrt4(81) = %lu\n", fourth_root(x2));  // 输出3
    
    // 测试用例3:最大值测试(2^128-1的四次方根)
    uint128_t max128 = ((uint128_t)1 << 127) - 1 + ((uint128_t)1 << 127);
    printf("sqrt4(2^128-1) = %lu\n", fourth_root(max128));  // 输出4294967295(0xFFFFFFFF)
    
    return 0;
}

你可能感兴趣的:(c语言)