计算得出规律,取余后转变为二进制按位或运算(有1则1),最终结果是余数中最大的数的二进制的最高位以后都变为1,即 最大余数*2-1
最大余数 | 结果 |
---|---|
0 | 0 |
1 | 2 |
2 | 3 |
4 | 7 |
8 | 15 |
16 | 31 |
32 | 63 |
64 | 127 |
128 | 255 |
错误代码
#include<bits/stdc++.h>
using namespace std;
int t;
long long n,m;
int x,ans;
int main(){
scanf("%d",&t);
for(int i=1;i<=t;++i){
scanf("%lld",&n);
m=0;
for(long long j=n/2;j<=n;j++){
long long y=n%j;
if(m<=y)//调试到这里时显示program received signal sigfpe,arithmetic exception
m=y;
}
x=log(m)/log(2);
ans=2*x-1;
printf("%lld\n",&ans);
}
return 0;
}
正确代码:
#include <bits/stdc++.h>
using namespace std;
int T;
long long n;
int main() {
scanf("%d",&T);
for(int i=1;i<=T;i++){
scanf("%lld",&n);
if(n==1) {
puts("0");
continue;
}
long long t=1;
while(t<n)
t<<=1;//把t的二进制数左移1位,然后把结果赋值给t
t>>=1;//把t的二进制数右移1位
t-=1;
printf("%lld\n",t);
}
return 0;
}