碼農往事
          我的代碼為什么這么丑?一定是因為我長的不好看
          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 on 2016-01-25 17:16 Jimi 閱讀(3423) 評論(0)  編輯  收藏 所屬分類: Java 、生活隨筆

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 昌吉市| 荣成市| 广西| 塔城市| 石屏县| 乐陵市| 开原市| 南部县| 图片| 桐城市| 滕州市| 布拖县| 孟连| 巩义市| 项城市| 丹寨县| 刚察县| 阿巴嘎旗| 封丘县| 拜泉县| 枣阳市| 萝北县| 阜平县| 工布江达县| 农安县| 额济纳旗| 东城区| 陇西县| 赣州市| 班玛县| 万宁市| 唐海县| 河源市| 昌平区| 鹤峰县| 丹巴县| 潜山县| 榆中县| 上虞市| 博罗县| 永州市|