码农往事
我的代码为什么这么丑?一定是因为我长的不好看
posts - 29,comments - 86,trackbacks - 0
说有一个屋里有多个桌子,有多个人? 如果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 阅读(3403) | 评论 (0)编辑 收藏