考察二进制知识

本文介绍了一种算法,用于解决寻找一个整数N的最小质因数的问题,并通过一个具体的数学问题来阐述该算法的实现过程。该算法利用二进制特性,通过判断特定条件下的整除性,快速找出最小质因数。
/*

类型:数论 

题目链接http://ac.nbutoj.com/Problem/view.xhtml?id=1360

给你一个N,让你找到最小的M使得(2 ^ N - 1) % (2 ^ M - 1) = 0。
2 ^ N的二进制数一定是1后面跟随一些0,那么2 ^ N - 1的二进制数每一位上都是1了,
所以要想使(2 ^ N - 1) % (2 ^ M - 1) = 0,
那么其实只要使2 ^ N - 1的二进制数里1的个数能整除2 ^ M - 1的二进制里1的个数就能保证(2 ^ N - 1) % (2 ^ M - 1) = 0。(想一想为什么)
当输入N时,那么(2 ^ N - 1)的二进制数的1的个数就是N。
那么此题就是一道水题了,问题变成了求N的最小质因数M。

解析:这道题目很奇葩,算是主要考察 二进制的算法吧。。
比如说:10101010 有因子1,10,1010,,也就是说可以分成整数个相同的子片段,或者将二进制末尾去0,如1010101片段
该子片段就能整除原段。。 

*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int flag=0;
        if(n%2==0) {  ///剪枝 
            printf("2\n"); 
            continue; 
        }
        int x=(int)sqrt(1.0*n);
        for(int i=3;i<=x;i+=2)
            if(n%i==0){ 
                printf("%d\n",i); 
                flag=1; break; 
            }
        if(!flag) 
            printf("%d\n",n);
    }
}     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值