题目链接
题意:
给你一个数字n,求1~n的数字相邻两位的二进制之间有多少位不同。
思路:
首先每加1,肯定会有至少一个位置不同,但有些情况会使得大于等于1的位置数字发生变化,经过分析,是碰到绝对偶数(2的次方倍)的情况时,不同的位置数就会+1,所以我们要求这个在小于等于n的情况下能够放下多少绝对偶数。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=5e5+5;
const int inf=0x3f3f3f3f;
signed main()
{
IOS;
int t;
cin>>t;
while(t--)
{
int n,num=0;
cin>>n;
while(n>0)
{
num+=n;
n/=2;
}
cout<<num<<endl;
}
return 0;
}

本文介绍了一种算法,用于计算从1到任意整数n之间,每个连续数字的二进制表示中,相邻两位之间不同位的数量。通过分析发现,当遇到2的幂次方时,不同位的数量会增加。文章提供了C++代码实现,通过迭代计算小于等于n的2的幂次方数量来得出总的不同位数。
1332

被折叠的 条评论
为什么被折叠?



