小明数
Description
小明比较喜欢研究各种各样的数字,有一天他发现了一类数,并将这些数命名为“小明数”,下面是“小明数”的定义:
数字的二进制由连续的k个1和连续的k-1个0组成。
比如:
1(二进制为:1,k=1)
6(二进制为:110,k=2)
120(二进制为:1111000,k=4)
496(二进制为:111110000,k=5)
现在给你一个数字n,求他所有的因子里最大的“小明数”。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10^5)
第2 - T + 1行:每行1个数n。(1 <= n <= 10^5)
Output
共T行每行对应每个测试用例的结果
Sample Input 1
2 3 992
Sample Output 1
1 496
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int a[100000];
int cnt = 0;
int q_pow(int a,int b){
int ans = 1;
while(b){
if(b&1)
ans *= a;
b >>= 1;
a *= a;
}
return ans;
}
void getnum(){
int t = 1;
int num;
do{
int tmp = 2 * t - 2;
int tmp2 = t;
num = 0;
while(tmp2){
num += q_pow(2,tmp);
tmp2--;
tmp--;
}
if(num < 100000) a[cnt++] = num;
t++;
}while(num < 100000);
}
int main(){
getnum();
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = cnt-1; i >= 0; i--){
if(n % a[i] == 0){
printf("%d\n",a[i]);
break;
}
}
}
return 0;
}