小明数(打表)

小明数

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值