题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4588
题目描述:
1)给两个数a,b;
2) 将a,b之间的数化为二进制相加;(包括a,b)
3)求总共的进位个数;
解题思路:
1)进位首先是在算术相应位对齐相加过程中产生的;
2)所以要模拟算术相加过程 ,总结怎样得到进位个数;
3)所以,另外考虑到时间上的可能性,不允许从a到b逐个数相加计算进位;
所以考虑从a到b所有数同时对应位对齐,找出相加的规则,总结出进位的统计方法;
4)由于二进制只有0,1,所以某位为0对进位没有贡献,只有1才对进位产生贡献;
所以考虑分别统计所有从a到b某一位的1的个数之和;比如统计0到4的第二位的1的全部个数:
00,01,10,11,100;第二位(也就是(1<<1)位)上是1的只有10,11,即十进制的2,3;所以(1<<1)
位上1的个数总数为2;统计完所有位的个数存在数组cal[]中;
5)然后通过列举发现:对于第i位的1<<i个数中,前1<<(i-1)个数为0,后1<<(i-1)个数为1,周期为1<<i;
所以可根据此规律完成上述a,b之间的各数位1的个数的统计,统计完数组后从低位向高位扫一遍,
按照二进制加法进位规则累加每位的进位数,得到最终的ans.
解题回顾:
此题当时拿过来就想着列举找规律,盲目的列举,盲目的统计,这样是很难找出规律的,对于这题数字统计,
1)要能想到模拟二进制加法计算过程
2)要能想到按各相应位来统计,而不是盲目列举统计
3)要能将复杂问题合理有序的拆解成若干简单问题去解
未完待续