您的位置:首页 > 其它

hihoCode太阁最新面经算法6——扩展二进制数

2016-06-26 13:42 281 查看
题目描述

我们都知道二进制数的每一位可以是0或1。有一天小Hi突发奇想:如果允许使用数字2会发生什么事情?小Hi称其为扩展二进制数,例如(21)ii = 2 * 21 +
1 = 5, (112)ii = 1 * 22 + 1 * 21 +
2 = 8。
很快小Hi意识到在扩展二进制中,每个数的表示方法不是唯一的。例如8还可以有(1000)ii, (200)ii,
(120)ii 三种表示方法。
对于一个给定的十进制数 N ,小Hi希望知道它的扩展二进制表示有几种方法?


输入

一个十进制整数 N。(0 ≤ N ≤ 1000000000)


输出

N的扩展二进制表示数目。

样例输入
8


样例输出
4

题目链接:http://hihocoder.com/contest/hihointerview11/problem/2

思路:

个人认为这道题属于递归+分治;

对于正整数N,

首先,考虑其第0位数:

若N为奇数,则第0位必定为 1;

若N为偶数则第0位为 0 或者 2 ;

接着,考虑(N-第0位)/ 2 可能的方案数,采取对第0位一样的做法。。。

代码如下:

//扩展二进制数
#include<cstdio>
#include<cstring>
int n;
int get(int x){
if(x==0||x==1) return 1;
if(x==2) return 2;
if(x%2){
return get(x/2);
}
else {
return get(x/2)+get((x-2)/2);
}
}
int main(){
scanf("%d",&n);
printf("%d\n",get(n));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制 分治 递归