irb(main):064:0> 5e-324 => 4.94065645841247e-3245*10^n の形であればちゃんと表示できると思ったんですが、そうでもないんですね。 なんでなんでしょ。
Macintosh-7:~ ktanaka$ irb1.9 irb(main):001:0> a=5e-324 => 5.0e-324 irb(main):002:0> a*1000 => 4.94e-321という結果をみると,「有効数字が十分でない時に余計な桁を表示しないようにしている」だけの違いなのかもしれません.
double d = strtod(tok(), 0);のように,C言語標準のライブラリであるstrtodを使って変換していることが確認でき,その疑いが晴れました.
a[k][i]=a[k][i]*1.0/akk
を
a[k][i]=a[k][i]/akk
に変更してから,
a=[[Rational(1,1),Rational(1,1),Rational(-1,1),Rational(2,1)],
[Rational(3,1),Rational(5,1),Rational(-7,1),Rational(0,1)],
[Rational(2,1),Rational(-3,1),Rational(1,1),Rational(5,1)]]
gj(a)
と,有理数で入力を与えると,
=> [[(1/1), (0/1), (0/1), (3/1)], [(0/1), (1/1), (0/1), (1/1)], [(0/1), (0/1), (1/1), (2/1)]]のように,有理数(この場合はすべて整数)で解が得られます.
def maxrow(a,k)
r = a.length()
t = a[k][k]
i = k
for j in k..(r-1)
if t**2 < a[j][k]**2
t = a[j][k]
i = j
end
end
i
end
ifの条件は, abs.rbを使わずに絶対値の大小を比べようと思い, 比較する値の2乗の大小を考えました.
def maxrow(a,k)
x = k
for i in (k+1)..(a.length-1) #a[i][k]の絶対値が最大となるi>=kを探す
if abs(a[x][k]) <= abs(a[i][k])
x = i
end
end
x
end
def maxrow(a,k)
#a[i][k]の絶対値が最大となるi>=kを探す
max = 0
maxi = 0
for i in (k..a.length-1)
if max < abs(a[i][k])
max = abs(a[i][k])
maxi = i
end
end
maxi
end
「i>=kのすべてのiについてa[i][k]==0」の場合はmaxiは0
のままになり,関数maxrowは0を返す.これは「a[i][k]の絶対値が最大となるi>=kを探す」という定義には合っていない(k <= i < a.length() の値を返すのが正しい).
maxi = 0の行を
maxi = kとすれば修正は可能.なお,「i>=kのすべてのiについてa[i][k]==0」の場合は 連立方程式の解がないケースであり,解があるような入力しか与えられないことを 仮定すれば,元のままでも実際に問題が生じることはない.
ruby vote.rb 選択肢番号のように使います.