說有一個屋里有多個桌子,有多個人? 如果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;
}
}
}
計算出來的結(jié)果是:i:229,value:2519
轉(zhuǎn)念一想,結(jié)果可能不止一個,于是換個寫法:
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范圍內(nèi)的計算結(jié)果:
count:6817408
iMax:2147483434
valueMax:23622317774
這邊遇到了一個問題,當代碼中的pram聲明為int類型時計算的結(jié)果會與聲明為long類型發(fā)生極大偏差,貌似是因為Java乘法對于int類型越界處理的問題,具體原因待查.
如果你用如下代碼執(zhí)行:
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);
最后數(shù)行看到的結(jié)果是這樣:
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
問題產(chǎn)生的原因應(yīng)該是Java對于int的乘法結(jié)果大于上限的情況,自動截取了前10位.
-----------------------------------------------------------------------------------------------------------------之前的理解不正確.
根據(jù)Java的基礎(chǔ)類型的變窄轉(zhuǎn)換(Narrowing primitive conversion)規(guī)則,對于運算結(jié)果超出int范圍的,將超出部分全部丟棄,只保留低32位的.
posted on 2016-01-25 17:16
Jimi 閱讀(3412)
評論(0) 編輯 收藏 所屬分類:
Java 、
生活隨筆