171127 #codeforces# Beautiful Divisors

1 问题描述

有一种数字,叫做beautiful numbers,当且仅当它的二进制表示是先由 k+1 个1,再由 k 个0组成的。比如:

图1 beautiful number示例

而在十进制表示时,有一种更方便的检验方法。如果 n 是一个beautiful number,那么 n=(2k1)(2k1)

任务:输入一个正整数,输出它的除数中,最大的beautiful number。注意,一定会有输出的,因为再不济,1就是一个beautiful number。

2 我的编程思路

给一个数 n ,由于它的除数肯定不会超过自身的一半,所以:
1. 先得到 n 的 1/2 位置的数 p;
2. for循环从 p 递减到 1,每次循环,先判断是否为 n 的除数,然后判断是否是beautiful number;
3. 一旦上述两个判断皆为 true,那么可以直接输出,终止程序了

上述思路明显有个漏洞,导致我没有被ac。即漏掉了 n 自身就是一个 n 的除数。考虑欠周啊!

3 我的代码

给出我的改后的ac代码:

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

bool isBeautiful(int num) {
    int cpn = num, bits = 0;
    while(cpn) {bits++; cpn /= 2; }

    if(bits % 2 == 0) return false;
    else {
        int k = (bits+1) / 2;
        if( (pow(2.0, (double)k ) - 1) * pow(2.0, (double)(k-1)) == num )
            return true;
        else
            return false;
    }
}

int main() {
    int n;

    while (cin >> n) {
        if(isBeautiful(n)) {
            cout << n << endl;
            continue;
        }

        for (int i = (n+1) / 2; i > 0; i--) {

            if( n % i == 0 && isBeautiful(i) ) {
                cout << i << endl;
                break;
            }
        }
    }
    return 0;
}

4 高手代码

看一位紫君的代码:

#include<cstdio>

int main(){
    int n;
    scanf("%d", &n);
    int t = ((1<<10)-1)<<9;
    while (n % t != 0){
        t -= t&-t;
        t >>= 2;
    }
    printf("%d\n", t);
}

这些位操作厉害了……不过据搞比赛的师弟说,位操作比较非主流……哈哈,那就先不分析了。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值