2016-06-28 2 views
0

以下は、優先順位が最も高い製品問題、すなわちリスト内の2つの数値の積の最大値を返すために実行しようとしているコードです。私の問題は、入力リストの数字が大きい場合、計算されている製品が正しくないということです。私は、整数のオーバーフローがエラーになることはなく、結果として得られる製品は自動的に長くなると考えていましたが、私の乗算が何らかのゴミを返すので、明らかに起こっていません。可能なPythonの整数オーバーフローエラー

#"python2" 
# -*- coding: utf-8 -*- 
""" 
Created on Tue Jun 28 17:12:38 2016 

@author: pvatsa 
""" 
import numpy as np 

n = int(raw_input()) 
alist = np.random.randint(100000, size = n) 
print alist 
assert(len(alist) == n) 
alist = sorted(alist) 
print alist 
max_no = max(alist) 
second_largest_no = alist[n-2] 
print max_no*second_largest_no 
#print long(product) 
#print type(product) 
+0

pythonのバージョンは2.7です:(正しくは動作しませんが –

+0

私はかなり悪いテストケースを実行している可能性があります。理論的には100k * 100kはint32をオーバーフローさせることができるので、この状況ではほとんどの場合、numpy配列 'alist = np.random.randint(100000、size = n、dtype = 'int64')' –

答えて

2

np.random.randintを使用すると、32ビット整数の配列を作成します。

>>> alist = np.random.randint(100000, size = n) 
>>> alist.dtype 
dtype('int32') 

のではなくPythonの(オーバーフロー金庫)にそれらをバック変換numpy.int32オブジェクトのリストを作成し、そのタイプを保存するソート整数:このよう

>>> foo = sorted(alist) 
>>> type(foo[-1]) 
<type 'numpy.int32'> 

、乗算オーバーフロー:あなたがいずれかの方法でそれを解決することができます:最初の場所でlong型のアレイを有するバックPythonの番号

  • から
  • をあなたの数字をキャスティング

    • 最初のケースは、単に関心の値を変換の問題です:

      >>> foo[-1] * foo[-2] 
      1386578402 
      >>> int(foo[-1]) * int(foo[-2]) 
      9976512994L 
      

      dtype=np.int64(numpy> = 1.11の場合)を使用してrandintを呼び出すか、後で配列を変換することで2番目の方法を実行できます。

      >>> llist = np.array(alist, dtype=np.int64) 
      >>> llist.sort() 
      >>> np.prod(llist[-2:]) 
      9987503750 
      
    +0

    に感謝します。それは完全に意味をなさない。また、numpyオブジェクトの作成をPythonのraw_input関数に置き換えて、raw_input()。split()] 'で' a = [int(x)]というリストを生成すると、すべてがオーバーフローセーフになり、目的の結果が得られました。 –

    関連する問題