首页 > 其他分享 >1075 - 寻找2的幂

1075 - 寻找2的幂

时间:2023-08-05 14:33:57浏览次数:47  
标签:输出 1075 幂次 30 寻找 距离 while ans

题目描述

数学上把 2 的 K 次方叫 2 的 K 次幂,如 4、8、32等。

给定一个整数 n ,请输出距离它最近的那个 2 的幂是多少。

如果有两个距离相同,输出那个小的。

输入

只有一个整数 n(10≤n≤2×10^9)

输出

只有一个整数,表示距离最近的那个 2 的幂。

  样例

输入

17

输出

16

看到这题,我眉头紧皱,一道题看着就没什么难度,居然是基础题,值2金币?
然后写了一遍提交发现确实不那么容易。
首先求2的幂次这个肯定都会,先求出比n小的最大的那个幂次记为ans,然后看看题目,题目说“如果有两个距离相同,输出那个小的。”,所以我们还得看看ans*2的值,比较一下两者距离n哪个更近。
用while求解,时间复杂度是O(log2n),差不多就30次循环左右吧,但是我突然想到,2的幂次和2进制似乎有些关联,用while把n的二进制最后一个1删掉,只留下最高位的1不就是比n小的最大的那个幂次吗?数据上限2^9转换成2进制是1110111001101011001010000000000,一共31位,有13个1,最差情况是INT_MAX/2这个30位1的情况,
时间复杂度在O(30)以下。
#include<bits/stdc++.h>
using namespace std;
int n,n1;
long long ans,ans1;
int main() {
    scanf("%d",&n);
    //保存下n的值
    n1=n;
    while(n) {
        //求n的最低位n&-n
        //消去最低位的1只需要两者相减即可 
        n-=(n & -n);
        if(n)ans=n;
    }
    //左移1位相当于乘2 
    ans1=ans<<1,n=n1;
    if(n-ans <= ans1-n)printf("%lld",ans);
    else printf("%lld",ans1);
    return 0;
}

 

标签:输出,1075,幂次,30,寻找,距离,while,ans
From: https://www.cnblogs.com/Ghost1GM/p/17607913.html

相关文章

  • 寻找理想的 Jarvis AI 替代方案:综合指南
    如果您通过此页面上的链接购买商品,我们可能会从我们的联盟合作伙伴那里赚钱。JarvisAI是一个强大的工具,可以帮助您完成各种任务,但它并不是唯一的选择。如果您正在寻找JarvisAI的替代品,您需要考虑一些事项。人工智能插图首先,你在人工智能助手中寻找什么?您是否需要可以帮助您......
  • LogonTracer:用于可视化分析Windows安全事件日志寻找恶意登录的工具
    LogonTracer:用于可视化分析Windows安全事件日志寻找恶意登录的工具 secist2018-05-3010:00:303802482简介LogonTracer是一款用于可视化分析Windows安全事件日志寻找恶意登录的工具。它会将登录相关事件中找到的主机名(或IP地址)和帐户名称关联起来,并将其以图形化的方式展现出......
  • 寻找转折点
    寻找转折点packagecom.vfsd.test;importjava.util.ArrayList;importjava.util.List;importcom.vfsd.core.RoutePoint;publicclassFindCornerPoint{publicstaticvoidmain(String[]args){List<RoutePoint>list1=newArrayList<R......
  • 【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路
    Link很简单的一道图论题。要在一个有向图上找一条\(s\)到\(t\)的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点\(t\)。看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集\(A\)进行标记,再再所有点中找到其所有出边所连点都被打上标......
  • 算法 | 就地逆置、双指针快速寻找中间节点
    2019年真题设线性表L=(a1,a2,a3,...,an-2,an-1,an)采用带头节点的单链表保存,链表中的结点定义如下:(代码1)设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结,得到线性表L’=(a1,an,a2,an-1,a3,an-2,...)。//代码1//langCtypedefstr......
  • 五分钟教你使用GitHub寻找优质项目
    https://www.cnblogs.com/Can-daydayup/p/17581307.html 思维导航前言首先解决访问慢的问题GitHub热门栏目GitHub上直接搜项目GitHub搜索小技巧前言经常会有同学会问如何使用GitHub找到自己想要的项目,今天咱们就出一期快速入门教程五分钟教你使用GitHub寻找优质项......
  • SpringBoot 启动流程分析(寻找扩展点)
    1、SpringBootmaven依赖版本<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=......
  • LC 4、寻找两个正序数组的中位数
    LC4、寻找两个正序数组的中位数题目描述这是LeetCode4、寻找两个正序数组的中位数,难度为困难给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的「中位数」。示例:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数......
  • rola-ip关停给企业带来哪些损失?急需寻找替代代理商解困
    rola-ip的网站已经连续几天都无法打开了,服务商已经跑路的消息传得沸沸扬扬,这给很多正在使用代理服务进行业务的用户带来很大的困扰。毫无预兆地突然消失,让许多企业急需寻找到可以接替它继续服务的代理商。rola-ip突然跑路,可能会给企业带来许多不便,如公司业务中断、数据连接变慢、信......
  • 寻找数组中重复的数字
    寻找数组中重复的数字​ 给定一个包含n+1个整数的数组nums,其数字都在[1,n]范围内(包括1和n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,返回这个重复的数。1<=n<=\(10^5\)nums.length==n+11<=nums[i]<=nnums中只有一个整数出......