博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解 CF9C 【Hexadecimal's Numbers】
阅读量:5281 次
发布时间:2019-06-14

本文共 2022 字,大约阅读时间需要 6 分钟。

思路

这个题目据可以有两种思路,一种是递归构造答案的方法,一种是使用公式计算的的方法。第一种方法就是楼下个位大佬的做法,就是对于1,我们如果要的到后面的两组答案,一种是对这个数乘10,或是乘10后加一,这样就得到了新的两种答案,我们在对新的答案这样递归求解下去,直到大于输入的数 $ n $ 为止,这样我们在一边递归的时候一边记录的到的新数的数量,就可以解决这个问题了。

但是其实还有另一种方法,这个方法稍微慢一点,就是我们先求出不大于 $ n $ 的一个最大的只由 0,1 组成的数我们要怎么求这个数呢。废话不说上代码:

scanf("%lld",& n);    //将这个数的每一位分解    while(n!=0){        num.push_back(n%10);        n/=10;    }    for(int i=num.size()-1;i>=0;i--){        if(num[i]>1) //如果这个位子上的数大于1了,那么我们要求的那个数之后的几位就全是1了            flag=true;        if(flag)            maxn.push_back(1);        else{ //由于不能让所求的数超过n所以为了让这个数尽量大,如果是1的地方就是1,不是1的地方就是0,这样所求的数就不会超过原来的数            if(num[i]==1)                maxn.push_back(1);            else                maxn.push_back(0);        }    }

假如我们有一个10013027那么我们之后得到的数就是10011111,之后我们发现我们只需要对这个数进行一些1变成0或0变成1之类或者什么操作都不做的操作就可以得到我们想要的答案。对于例子中得到的数10011111,假如我们让第一个1变成0,那么后面的数不管进行什么操作的到的数一定是小于例子中的得到的数的,所以我们假设当前位置为i那么我们就可以用2^(len-i)去更新答案 len 就是那个得到的数的长度。

Ps:这个算法这么解释有些地方其实是不对的,但是这些地方难以用言语解释清楚,所以你们可以自己去证明,但是这个思路的大体方向就是这样没错的。如果你想让程序跑得更快,可以用快速幂来优化。

完整代码:

#include 
#include
#include
#include
using namespace std;bool flag=false;long long n;vector
num,maxn; //注意:maxn是反过来存的long long power(long long x,long long y){ long long ans=1,base=x; while(y!=0){ if(y&1) ans=ans*base; base=base*base; y>>=1; } return ans;}int main(){ scanf("%lld",& n); while(n!=0){ num.push_back(n%10); n/=10; } for(int i=num.size()-1;i>=0;i--){ if(num[i]>1) flag=true; if(flag) maxn.push_back(1); else{ if(num[i]==1) maxn.push_back(1); else maxn.push_back(0); } } long long ans=0; for(register int i=0;i<(int)maxn.size();i++){ if(maxn[i]==1){ ans+=power(2,(int)maxn.size()-1-i); } } printf("%lld\n",ans); return 0;}

转载于:https://www.cnblogs.com/lixiao189/p/9533993.html

你可能感兴趣的文章
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>
rotate the clock
查看>>
bugku 变量
查看>>
数据库01 /Mysql初识以及基本命令操作
查看>>
数据库02 /MySQL基础数据类型以及多表之间建立联系
查看>>
Python并发编程04/多线程
查看>>