面试常问的思维题

1.1.给出rand(5)的函数,实现rand(7)的函数

rand(7) = 5×(rand(5)-1)+rand(5),
因为5×(rand(5)-1)+rand(5)可以构造出1-25的每一个整数,7*3 = 21,所以如果超过21则重新计算,直到小于等于21,返回该值%7 + 1
实现代码如下:

int rand7(){
    int x;
    while(true){
        x = 5*(rand5() - 1) + rand5();
        if(x <= 21)
            break ;
    }
    return x%7 + 1;
}

1.2.给出rand(5)的函数,实现rand(n)的函数

其实这就用到了二进制的知识
我们不妨先用rand(5)得到rand(2),然后通过二进制组成rand(n)
实现代码如下:

int rand1(){
    int x;
    while(true){
        x = rand5();
        if(x <= 4)
            break ;
    }
    return x%2;
}
int randn(){
    int x;
    int cnt = ceil(log(n))
    while(true){
        x = 0
        for(int i=0;i<cnt;i++){
            if(rand1() == 1){
                x += (1<<i);   
            }
        }
        if(x < n)break ;
    }
    return x + 1;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务