[算法]由日期格式函数产生的若干思考 y * 512 + m * 32 + d
来源:互联网 发布:工程决算软件下载 编辑:程序博客网 时间:2024/05/22 01:42
[算法]由日期格式函数产生的若干思考 y * 512 + m * 32 + d
完整源码
// Java Codepublic class TestDate{ public static void main(String args[]){ int m = Integer.parseInt(args[0]); int d = Integer.parseInt(args[1]); int y = Integer.parseInt(args[2]); Date date = new Date(m,d,y); System.out.println(date); }}class Date{ private final int value; public Date(int m,int d,int y){ value = y*512+m*32+d; } public int month(){ return (value/32)%16; } public int day(){ return value%32; } public int year(){ return value/512; } public String toString(){ return month()+"/"+day()+"/"+year(); }}
代码说明
value = y * 512 + m * 32 + d; value = y * 2^9 + m * 2^5+ d; m = (value / 32) % 16; // 除以32后,剩下 y*2^4 + m(d消掉了,2^4 = 2^9 / 2^5),接着再用16(即2^4)取余,得m d = value % 32; // 用32取余自然剩下余数d y = value / 512; // 用512除法自然得到y // 简单猜测计算了一下,输入条件应该限定在:m 取值范围在[0,15] (2^4-1), d 取值范围在[0,31] (2^5-1).
用例测试
分别取了边界以及边界+1的几组用例来测m([0,15] )、d([0,31])的取值范围.
我的思考
这种把3个输入运用乘法变成1个数字,再运用适当的规则拆回来的思路真是绝顶赞啊! 同时,这种拆的规则也是非常巧妙,我今天算是彻底体会了取余和除法的那种微妙地差别和巧妙地混合使用了,实在开心。
以前遇见过的类似的运算,就是那种取出每个数位上的数字的题目,比如说
2015 = 2*10^3+0*10^2+1*10^1+5*10^0
,需要取出2 0 1 5这几个数字,思路简直异曲同工!上面的代码里会使用512=2^9 32=2^5
的确是为了配合日期格式这一目的;因为数值都不大,边界可以快速手工确定,可以的话我挺想看看严谨的数学推导过程。对于这样的数字来说,+所起到的或许就是抽象意义上的“连接“的作用而非单纯只有数学意义上的求和吧,或者这么说求和是形式而不是目的;
写到这里,我终于想到了那个可能的大话题,或许就是所谓的“进制转换”吧,算法真是很有趣呢!
引用参考
图灵程序设计丛书:算法(第4版) 塞奇威克 (Robert Sedgewick) (作者), 韦恩 (Kevin Wayne) (作者),
谢路云 (译者)
0 0
- [算法]由日期格式函数产生的若干思考 y * 512 + m * 32 + d
- JS 获取n天后的日期(返回Y-m-d字符串格式)
- MYSQL数据更新,字符串'%d/%m/%Y'形式,换成日期'%Y-%m-%d'形式
- date: 无效的日期"2 days ago+%Y%m%d"-------注意空格啊
- firefox中Date.prase()解析 'Y-m-d'格式的时间, 返回NaN的问题
- 编写函数,求出并设置y年m月d日的前一天或后一天的日期(能正确判断闰年)
- php截取日期date(\'Y-m-d\',strtotime($row->newstime)
- php中的date()函数d y m l等字母的表示方法
- PHP date(); 日期和时间格式大全 PHP date("Y-m-d H:i:s"); 获取当前时间 差8小时解决办法
- Y D L M是什么意思?
- 输入日期(y m d)计算下一天 并输出
- JS-格式化日期y-m-d h:i:s-例子说明
- JS日期时间类型(Y-m-d H:i:s)与时间戳互转
- JS日期时间类型(Y-m-d H:i:s)与时间戳互转
- JS日期时间类型(Y-m-d H:i:s)与时间戳互转
- JS日期时间类型(Y-m-d H:i:s)与时间戳互转
- Ext4 日期控件为[Y-m]格式,选择2月变3月解决方案
- mysql 时间戳按指定格式(Y-m-d)取出
- JAVA 关于rotate()以后坐标以及显示的问题
- C++ POD与结构体声明
- Jsoup+HttpClient获取新浪新闻数据
- 就这样,你与35W擦肩而过
- C语言笔记之数据类型(二)
- [算法]由日期格式函数产生的若干思考 y * 512 + m * 32 + d
- 秒懂单链表及其反转(reverse)
- 黑马程序员-IO流
- JavaWeb 服务启动时,在后台启动加载一个线程
- spring security详解
- nfs
- bootstrap2 多级下拉菜单
- <C/C++算法>贪心策略练习与总结
- 动态规划(一)