惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
G
Google Developers Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
B
Blog RSS Feed
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
博客园 - 【当耐特】
P
Privacy International News Feed
I
InfoQ
L
LINUX DO - 热门话题
H
Help Net Security
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
AWS News Blog
AWS News Blog
Scott Helme
Scott Helme
Cyberwarzone
Cyberwarzone
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Forbes - Security
Forbes - Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
WordPress大学
WordPress大学
T
Troy Hunt's Blog
Spread Privacy
Spread Privacy
V
V2EX
Cloudbric
Cloudbric
Security Latest
Security Latest
H
Heimdal Security Blog
S
Securelist
I
Intezer
F
Full Disclosure
V2EX - 技术
V2EX - 技术
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
Security Archives - TechRepublic
Security Archives - TechRepublic
L
Lohrmann on Cybersecurity
S
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA

博客园 - Edison.Feng

Objective-读Xml [转]iPhone Mapkit 之在地图加入坐标点 使用MKAnnotation和MKAnnotationView [转]Android:使用URL和URLConnection(多线程下载) 【转】httpModules 与 httpHandlers 【转】挣脱浏览器的束缚(2) - 别让脚本引入坏了事 [转]asp.net中利用ashx实现图片防盗链 C#利用反射获取对象属性的修改情况 C#利用反射获取对象属性值 Clone:Xml序列化反序列克隆对象 [转]Linux slab 分配器剖析 [转]Linux对I/O端口资源的管理 [转]linux内核分析-初始化分析 start_kernel paging_init [转]Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff ) [转]Linux系统内核接收以太帧的处理程序 母牛生小牛(递归) MS SQL:Funcation拆分行 我使用WebService:Function.asmx的惊叹!!!
求任何一个正数的组合,组合的规则是这个数等于1或2的整数幂之和,请列出组合的情况。
Edison.Feng · 2010-05-13 · via 博客园 - Edison.Feng
 

求任何一个正数的组合,组合的规则是这个数等于1或2的整数幂之和,请列出组合的情况。

比如:

11 = 1,2,8
26 = 2,8,16

31 = 1,2,4,8,16

96 = 64,32

1.拆分法

分析:把10进制数转换2进制

11 = 1,2,8         -> 1011 = 1,10,100

31 = 1,2,4,8,16  -> 11111 = 1,10,100,1000,10000

96 = 64,32        -> 1100000 = 100000,1000000

是不是看出了点规律呢? 对,任何10进制数转换成2进制后,都能按位从右到左遇1拆分,拆分的结果,转换成10进制,正好就是求解的组合。因为2的整数幂转换成2进制后正好是1开头,之后全是0. 比如:1,2,4,8 -> 1,10,100,1000

实现:

List<int> GetCombines(int number)
        {
            List<int> combines = new List<int>();
            string str = Convert.ToString(number, 2);
            for (int i = 0; i <= str.Length - 1; i++)
            {
                if (str[i] == '0') continue;
                string s = Math.Pow(10, str.Length - i - 1).ToString("F0");
               combines.Add(Convert.ToInt32(s, 2));
            }

            return combines;
        }

2. 穷举法

 分析:把10进制数N转换2进制,从1开始穷举2的整数幂,会发现与N的2进制与运行后,结果不等于0的正好是N的2进制组成成员。

实现:

        List<int> GetMask(int number)
        {
            List<int> mask = new List<int>();
            int baseElement = 1;
            int sumOfElement = 0;
            while (sumOfElement < number)
            {
                if ((baseElement & number) != 0)
                {
                    sumOfElement += baseElement;
                    mask.Add(baseElement);
                }
                baseElement = baseElement * 2;
            }
            return mask;
        }