说有一个屋里有多个桌子,有多个人? 如果3个人一桌,多2个人。 如果5个人一桌,多4个人。 如果7个人一桌,多6个人。 如果9个人一桌,多8个人。 如果11个人一桌,正好。 请问这屋里多少人?
最近比较闲,逛论坛看到随手做了.
最小答案是
代码如下:
public static void main(String[] args) {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
long value = i * 11;
if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
System.out.println("i:" + i + ",value:" + value);
break;
}
}
}
计算出来的结果是:i:229,value:2519
转念一想,结果可能不止一个,于是换个写法:
public static void main(String[] args) {
int count = 0;
long value;
long valueMax = 0;
long iMax = 0;
long pram = 11;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
value = i * pram;
if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
count++;
if (iMax < i) {
iMax = i;
}
if (valueMax < value) {
valueMax = value;
}
}
}
System.out.println("count:" + count);
System.out.println("iMax:" + iMax);
System.out.println("valueMax:" + valueMax);
}
当i在Integer.MAX_VALUE范围内的计算结果:
count:6817408
iMax:2147483434
valueMax:23622317774
这边遇到了一个问题,当代码中的pram声明为int类型时计算的结果会与声明为long类型发生极大偏差,貌似是因为Java乘法对于int类型越界处理的问题,具体原因待查.
如果你用如下代码执行:
int count = 0;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
long value = i * 11;
if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
System.out.println("i:" + i + ",value:" + value);
count++;
}
}
System.out.println("count:" + count);
最后数行看到的结果是这样:
i:2147475704,value:2147396264
i:2147476019,value:2147399729
i:2147476334,value:2147403194
i:2147476649,value:2147406659
i:2147476964,value:2147410124
i:2147477279,value:2147413589
i:2147477594,value:2147417054
i:2147477909,value:2147420519
i:2147478224,value:2147423984
i:2147478539,value:2147427449
i:2147478854,value:2147430914
i:2147479169,value:2147434379
i:2147479484,value:2147437844
i:2147479799,value:2147441309
i:2147480114,value:2147444774
i:2147480429,value:2147448239
i:2147480744,value:2147451704
i:2147481059,value:2147455169
i:2147481374,value:2147458634
i:2147481689,value:2147462099
i:2147482004,value:2147465564
i:2147482319,value:2147469029
i:2147482634,value:2147472494
i:2147482949,value:2147475959
i:2147483264,value:2147479424
i:2147483579,value:2147482889
count:3718586
问题产生的原因应该是Java对于int的乘法结果大于上限的情况,自动截取了前10位.
-----------------------------------------------------------------------------------------------------------------之前的理解不正确.
根据Java的基础类型的变窄转换(Narrowing primitive conversion)规则,对于运算结果超出int范围的,将超出部分全部丢弃,只保留低32位的.
posted @
2016-01-25 17:16 Jimi 阅读(3401) |
评论 (0) |
编辑 收藏
有位朋友问起,我就顺便总结一下好了。个人知识有限,有谬误欢迎指正。本人一直从事的服务端相关的工作,对前端只能说是耳闻目染。参与的项目主要是页游和手游。从程序开发角度讲起,程序一般常分为前端程序和后端程序。一.前端前端就是指玩家所使用的客户端,主要包括处理UI事件和向服务端发送请求。页游主流的技术有ActionScript及新兴的Unity框架,由html5和JavaScript做的小游戏也不少。手游上现在比较火的框架就是cocos2d-x和Unity 3D,cocos2d-x 是开源的,Unity 对开发者收费。两者都支持多平台,就是说一次开发,ios、android等平台都可以生成相应代码。我自己只稍微玩过一点cocos2d-x,主要用的语言是C++,也可以跟Lua混合使用。Unity平台则支持C#、Boo、JavaScript、Lua,我没玩过,不发表评论。2者现在都很火,行情都还不错。最近比较大的新闻,就是Unreal Engine虚幻引擎宣布开发者免费,感兴趣的可以自行google下。二.后端通常所说的后端,常指的客户端发送请求的接收和处理者。语言的选择就很多了,Java、C++、Python、PHP等等。端游等对实时性能要求比较高的场合,一般会选择C++,与之相应的开发成本更高。相对来讲,手游页游选其它语言的就很多了。一般根据对实时性的要求,来选择合适的通信方式,长连接或短连接,以及合适的通讯协议如http、protobuf、amf3,及自定义协议等。大多数时间,你主要的工作在定义协议、写游戏逻辑然后与客户端联调。另外,服务端一个重要的工作就是负责数据的存储,mysql数据库是一个很常见的选择,还有这几年兴起的各种Nosql数据库,其中尤其是redis(有人说它不是数据库),用的越来越多。最后,对于日志的处理,也是至关重要的。常用到的框架有log4j以及logback。简单粗暴点的,你可以另外开线程,直接丢入数据库,精细点的可以先写log文件,然后用脚本解析,转发到日志服务器然后再存入数据库。如果是放mysql数据库,记得把二进制日志关掉,不然没跑几天硬盘就爆了。工作内容上,除了上述事务,经常需要你做的事情还有:其一,各种游戏平台的SDK对接,页游如腾讯、360、37wan,手游如苹果官方、谷歌官方以及各种大小平台;其二,制作游戏测试工具,GM命令等;其三,开发供运维人员使用的WEB版本的游戏管理平台。小规模的公司,你可能啥都要做,人力配置稍微宽松的公司,这些工作往往会区分开来。架构上来说,大型游戏的服务端,会分成登录服、逻辑服、数据存储服、日志服、GM管理服甚至更复杂。一般服务器承载量不高的情况下,单进程的登录-逻辑-数据的架构也很常见。从团队结构角度讲,常见的职位分配:
1.策划类:主策划、关卡策划、数值策划、剧本策划2.美术类:主美、UI、3D建模、动作、特效、场景、原画3.程序类:后端、前端4.其它:商务、运营、维护、QA一个大规模团队里往往美术是最多的,现在是看脸的时代,囧RZ!好的美术都是用钱砸的。小团队来说,自然就是需要各种身兼数职的牛人。策划?一个就够了,前端?策划也能兼,后端?一个就够了运维?后端也能干美术?不好搞就外包吧这个世界上永远不缺少一个人搞定以上所有事情的大牛。答博友问:我们当时的团队是,策划兼前端,共3前端,后期只剩俩了,后端,前期俩,后期只剩我一个,还有一位特效,美术外包。答毕。该休息了
在此申明,转载——请注明出处。来自:http://www.blogjava.net/rockblue1988/archive/2015/03/10/423328.html
posted @
2015-03-10 02:05 Jimi 阅读(4160) |
评论 (3) |
编辑 收藏