游戏中的总传球次数

时间:2013-10-02 12:04:17

标签: c algorithm

n名球员之间存在竞争。在特定轮次中,如果玩家的数量是奇数,那么一些玩家需要被传递,这是玩家直接转移到下一轮,因为他们没有在该轮中分配给他们的对手。

我们需要确定这样一场比赛中的传球总数,因为每轮比赛的得分最少,以便在那一轮比赛中有最多的球员。

不用担心哪个球员能够传球。

1·; = N&LT = 10 ^ 19

这是我的方法......

#include<stdio.h>
int main()
{
        long long n,temp,ans=0;
        scanf("%lld",&n);
        while(n>2)
        {
                    if(n % 2 != 0)
                    {
                            temp = 1;
                            ans += 1;
                    }
                    else
                            temp=0;

                    n = n/2+ temp;
        }
        printf("%lld\n",ans);
    return 0;
}

实施例 -

对于n = 7

答案是1 ...

但是我得错了答案......请帮忙...... !!

3 个答案:

答案 0 :(得分:1)

编辑以反映有问题的更改

long long允许的最小尺寸为2 ^ 63 -1,即0.922 * 10 ^ 19.

尝试使用可以容纳2 ^ 64 -1或1.844 * 10 ^ 19的unsigned long long

答案 1 :(得分:1)

执行此操作的一种简单方法是从n中找到次高次幂为2。然后减去n。您需要的奇数轮次数等于表示该数字所需的 set 位数。

例如:

n = 7
    next highest = 8
    8 - n = 1
    one bit(1), so rounds = 1

n = 5
    next highest = 8
    8 - n = 3
    two bits(11), so rounds = 2

n = 9
    next highest = 16
    16 - n = 7
    three bits(111), so rounds = 3

n = 6
    next highest = 8
    8 - n = 2
    one bit(10), so rounds = 1

n = 11
    next highest = 16
    16 - n = 5
    two bits(101), so rounds = 2

答案 2 :(得分:0)

将您的代码更改为

        int main(){

            int ans = 0;
            int temp = 0;
            int n = 7;

            while(n > 2)
            {
                    temp = 0;
                    if(n % 2 != 0)
                    {
                            temp = 1;
                            ans += 1;
                    }

                    n = n / 2 + temp;
            }

            printf("%d\n", ans);

因为在第一次迭代之后,temp变为1,但在每次迭代之前它应该为0.