• ベストアンサー

11桁の分数の通分について

大至急お願いします。 Access2000のVBAで通分が必要となりました。 現在使用しているロジックでは時間がかかるため、高速なロジックを教えてください。 なお、分子は1~99999999998(11桁)の範囲、分母は2~99999999999(11桁)の範囲となります。 1/2でから、1/99999999999の範囲で通分しなければなりません。よいアイデアをお願いします。m(__)m 現在は、以下のロジックで最大公倍数と最小公倍数を算出しています。 Private Function VBA_LCM2(ByVal m As Double, ByVal n As Double) As Double If m > 0 And n > 0 Then VBA_LCM2 = m * n / VBA_GCD2(m, n) End If End Function Private Function VBA_GCD2(ByVal m As Double, ByVal n As Double) As Double If m > 0 And n > 0 Then Do Until m = n Select Case True Case m = n Exit Do Case m > n m = m - n Case m < n n = n - m End Select Loop VBA_GCD2 = m End If End Function

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

こんにちは。maruru01です。 VBもC同様、再起的用法が可能です。 以下を参照のこと。 http://jh7bpd.hp.infoseek.co.jp/program_koza/gcm_sample.htm http://www.cty-net.ne.jp/~koji_pc/Algorithm/GCD.html

参考URL:
http://jh7bpd.hp.infoseek.co.jp/program_koza/gcm_sample.htm,http://www.cty-net.ne.jp/~koji_pc/Algorithm/GCD.html
PAPA0427
質問者

お礼

ありがとうございました。 いつもピンポイントのご回答ですね。これで何とかなりそうです。本当にありがとうございました。

その他の回答 (3)

noname#6715
noname#6715
回答No.3

#2です。 んじゃあ#1さんに負けないように 僕はVBで回答しようかな? Function gcm(a,b) dim c as Integer Do while b > 0 c = a mod b a = b b = c Loop gcm = a End Function Function lcm(a,b) Dim g as Integer = gcm(a,b) lcm = a/g * b End Function

PAPA0427
質問者

お礼

なるほど、そうやれば良いですね。 なんとかなりそうです。ありがとうございました。 いつもここは回答が早いので嬉しいです。2回もご回答ありがとうございました。

noname#6715
noname#6715
回答No.2

自分も昔その辺のアルゴリズムの本を読んだことがありました。懐かしい・・・中2くらいかな? どんどんnを引いてって差が0になるって いうのは割り算のあまりで分かるんですよね ユークリッド互除法 http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

最大公約数を求めるにはユークリッドの互助法が高速なロジックですね。 JavaScriptなら function gcm(a,b) { var c ; while ( b > 0 ){ c = a%b ; a = b ; b = c ; } return a ; } こんな感じです。C言語がわかれば読めると思います。 また、最小公倍数は function lcm(a,b) { var g = gcm(a,b) ; return a/g*b ; } の様に最大公約数から求める事で対応出来ます。 VBでの記述方法が解れば再回答します。

PAPA0427
質問者

お礼

ありがとうございます。 参考になりました。

関連するQ&A