滑稽数(通过打表ac)
描述
最近大恶人了解到一种特殊的数字,他称这种数字为滑稽数。
如果一个数的二进制表示由k+1个连续的1和k个连续的0组成,那么这个数被称为滑稽数。 下面是一些滑稽数的例子:
更正式地说,如果存在某个正整数k,使得这个数等于
(2k-1)*(2k-1)
那么这个数是滑稽数。
大恶人有一个整数n,他想在n的约数中找到最大的滑稽数。帮他找到它!
输入格式:
仅一行包含一个数n(1≤n≤100000)表示大恶人拥有的数。
输出格式:
输出一个数字表示最大的滑稽数。
输入样例
992
输出样例
496
思路分析
把从1到n(大恶人的数)所有的滑稽数找出来存在数组里面,然后对数组从后到前(数值从大到小)遍历,找到能整除n的数,最后输出。
这就是打表的思路。
约数是一个数的因子,即 约数1x约数2=这个数
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000;
int a[maxn];
int c2(int power){
int result=1;
int dase=2;
while(power>0){
if(power%2==1){
power--;
result=result*dase;
}
power=power/2;
dase=dase*dase;
}
return result;
}
int main(){
int m;
cin>>m;
int k=1;
int re=0;
while(re<=m){
a[k]=(c2(k)-1)*c2(k-1);
re=a[k];
k++;
}
for(int i=k-1;i>=1;i--){
if(m%a[i]==0){
cout<<a[i]<<endl;
break;
}
}
return 0;
}