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 ...
但是我得错了答案......请帮忙...... !!
答案 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.