2つの分数 U/SとV/tの足し算は、Sとtの最小公倍数を l とするとき、
u×l/S+u×l/t 分のlによっておこなわれるんですが、最小公倍数を
ユークリッドの互除法で求め、分数の足し算を分数のまま実行するには
どうプログラムすればよいのでしょうか?教えてください。
宜しくお願いいたします。 

 

A 回答 (2件)

まず、ユークリッドの互除法で求められるのは、最大公約数ですよね。



これは、
int Euclid(int S, int T){
int x,y,z;
x=S;y=T;
for(;;){
z=x%y;
if(z==0){break;}
x=y;y=z;
}
return y;
}
で、求まります。
最小公倍数は、
S*T/Euclid( S, T);
で求まります。
あとは、
l=S*T/Euclid( S, T);
((u*l/S)+(v*l/T))/l;
これで、U/S+V/Tが求められます。

部分部分細切れになっているので、つなげればできますよね。
    • good
    • 0
この回答へのお礼

勉強させられます。ありがとうございました。

お礼日時:2001/10/25 01:35

ユークリッドの互除法って最大公約数を求める理論ですよね?


何回も最大公約数を求めるのは面倒なので
足し算自体は 簡単に (分子1 * 分母2) + (分子2 * 分母1)で 分子
分母1 * 分母2 で 分母 を計算して

求めた分子と分母を最大公約数を使い約分しました。
なお参考ソースは 数値チェックや0除算などのチェックを行っていません。
コマンドボタンとテキストボックスを使用しました。

参考ソース
↓↓↓↓↓↓↓↓↓↓↓↓↓

Private Sub Command1_Click()

Dim la As Long
Dim lb As Long
Dim lm As Long
Dim ln As Long
Dim li As Long

Dim ltxtU1 As Long '分子入力1
Dim ltxtD1 As Long '分母入力1

Dim ltxtU2 As Long '分子入力1
Dim ltxtD2 As Long '分母入力1

Dim ltxtU3 As Long '分子答え
Dim ltxtD3 As Long '分母答え

ltxtU1 = Text1(0).Text
ltxtD1 = Text1(1).Text
ltxtU2 = Text1(2).Text
ltxtD2 = Text1(3).Text

la = (ltxtU1 * ltxtD2) + (ltxtU2 * ltxtD1) '分子
lb = (ltxtD1 * ltxtD2) '分母

lm = la
ln = lb

Do Until lm Mod ln = 0

li = lm Mod ln
lm = ln
ln = li

Loop

'最大公約数 = ln

ltxtU3 = la / ln
ltxtD3 = lb / ln

Text1(4).Text = ltxtU3
Text1(5).Text = ltxtD3

End Sub
    • good
    • 0
この回答へのお礼

これをもとに勉強したいと思います。ありがとうございました。

お礼日時:2001/10/25 01:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q分数の連立方程式の解き方を教えてください。

分数の連立方程式の解き方を教えてください。
 a=4500000+60000/260000b
 b=4250000+30000/180000a

Aベストアンサー

[問題] は
 a = 4500000 + (60000/260000)b
 b = 4250000 + (30000/180000)a
なのですね。

ならば、
 a = 4500000 + (60000/260000)b   (1)
   ↓ 代入して、
 b = 4250000 + (30000/180000)a
  =4250000 + (30000/180000){4500000 + (60000/260000)b}
を、まず解くのでしょう。

b の項を左に集めれば、
 b - (30000/180000)(60000/260000)b = 4250000 + (30000/180000)4500000
 b(25/26) = 4250000 + 750000 = 5000000
 b = 200000*26 = 5200000   (2)

ここで (1) へ戻り、
 a = 4500000 + (60000/260000)*5200000
  = 4500000 + 60000*20
  = 4500000 + 1200000
  = 5700000

…かな?
検算してみて頂戴。。
  

[問題] は
 a = 4500000 + (60000/260000)b
 b = 4250000 + (30000/180000)a
なのですね。

ならば、
 a = 4500000 + (60000/260000)b   (1)
   ↓ 代入して、
 b = 4250000 + (30000/180000)a
  =4250000 + (30000/180000){4500000 + (60000/260000)b}
を、まず解くのでしょう。

b の項を左に集めれば、
 b - (30000/180000)(60000/260000)b = 4250000 + (30000/180000)4500000
 b(25/26) = 4250000 + 750000 = 5000000
 b = 200000*26 = 5200000   (2)

ここで (1) へ戻り、
 a = 4500000 + ...続きを読む

Q最小化ボタンで最小化したフォームを最小化から復帰するには?

すみません。教えていただきたいことがあります。
最小化ボタンで最小化したフォームを最小化から復帰するにはどうすればよいのでしょうか?

次のことを実行したのですが、だめでした。
myForm.Show()
myForm.Visible = True
myForm.BringToFront()

申し訳ありません。よろしくお願いします。

Aベストアンサー

myForm.WindowState = FormWindowState.Normal
を試してください。

Q連立方程式の解き方がいまいちぱっとしません だいたいの連立方程式は右図のようにしますがこの問題のよう

連立方程式の解き方がいまいちぱっとしません だいたいの連立方程式は右図のようにしますがこの問題のように勝手に足し合わしたりしていんでしょうか。

Aベストアンサー

肝心な数学の基礎が全く脱落しているようです。中学校一年の数学の教科書を取り出してしっかり復習しましょう。
・・・冗談でも嫌味でもなく、本当に大事なところが抜けてしまっている・・・深刻です。

小学校の算数から中学の数学になったときに計算が大きく変わりましたね。
1) 引き算は、その数の負数を加えること。
  負数とはその数に加えると0になる数
2) 割り算は、その数の逆数をかけ合わせること・
  逆数はその数にかけると1になる数
・・・この二つのことで、未知数であっても初めて計算が自由に扱えるようになった。
 小学校では、5個×3=15本だったし、3-2≠2-3、2÷3=3÷2だったのが、
       5(本)×3 = 3× 5 (本)、3+(-2)=(-2)+3、2×(1/3) = (1/3)×2
3) 両辺が=の関係である時、両辺に同じ処理をしても=の関係は変わらない。
 2x - 4 = 6  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄★
すなわち
 2x + (-4) = 6
  両辺に 4を加えると
 2x + (-4) + 4 = 6 + 4
 2x = 10      結果であるテクニックとしての[移項]は知っている
  両辺に(1/2)をかける
 2x × (1/2) = 10 × (1/2)
  交換則で
 x × 2 ×(1/2) = 5
  x = 5

たったこれだけを中学一年で一年かけて徹底的に学んだはず・・・中学数学の半分はこれと言ってもよい。
底が抜けているので、いくら解き方を覚えても役には立たない。
 [移項]処理は、「両辺に同じ処理をしても=の関係は変わらない」ことの結果にしか過ぎない。その結果--解き方だけ覚えて、理数科でもっとも肝心な「理由」を身につけてこなかった---でしょ!!!

 だから連立方程式は、未知数を一つずつ消していくという「消去法」というテクニックしか身についていない。繰り返しますが、理科や数学は解き方をいくら覚えても、せいぜい、その時の試験しかパスしない。

例えば、
 a + b = 0
 b - a + c = 0
 a + c - 1 = 0
という式があったとします。どうやって解きますか?
掃き出し法で解いてみましょう。

1) まず、式を下記のように変形します。
  a + b   = 0  一番下の式を加え
 -a + b + c = 0
  a   + c = 1

 2a + b + c = 1 中の式を引く
 -a + b + c = 0
  a   + c = 1
★ 両辺が=の関係である時、両辺に同じ処理をしても=の関係は変わらない。
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄★
  ここはわかりますか>>>だってすべての式は=で結ばれている。

 3a     = 1 3で割る
 -a + b + c = 0
  a   + c = 1

  a     = 1/3
 -a + b + c = 0
  a   + c = 1  一番上の式を引く

  a     = 1/3
 -a + b + c = 0  一番上の式を加えて
      c = 2/3

  a     = 1/3
    b + c = 1/3 一番下の式を引く
      c = 2/3

  a     = 1/3
    b   = -1/3
      c = 2/3

 これは「掃き出し法」と言われる解き方で、連立方程式を解く一番たくさん使われている方法です。特にコンピューターで計算しやすいためにコンピュータで解くときは100%この方法です。

 下記に、これを

  1  1  0 = 0
 -1  1  1 = 0
  1  0  1 = 1

と書き直して、簡単にする方法を説明しています。

参考)これってどうやって解くんですか?? - 数学 | 教えて!goo( https://oshiete.goo.ne.jp/qa/9194001.html )

 何度も繰り返しますが、「解き方」を覚えて、それを使って解くのではなく、なぜその方法で解けるのかを理解するようにしましょう。そうすれば、見たことない問題でも解けようになる。公式忘れたって公式をその場で作ればよい。

肝心な数学の基礎が全く脱落しているようです。中学校一年の数学の教科書を取り出してしっかり復習しましょう。
・・・冗談でも嫌味でもなく、本当に大事なところが抜けてしまっている・・・深刻です。

小学校の算数から中学の数学になったときに計算が大きく変わりましたね。
1) 引き算は、その数の負数を加えること。
  負数とはその数に加えると0になる数
2) 割り算は、その数の逆数をかけ合わせること・
  逆数はその数にかけると1になる数
・・・この二つのことで、未知数であっても初めて計算が自由に...続きを読む

Q現在2017/4/1から2018/3/31までの日月の入った表があります。ボタンを押すと1年足されて

現在2017/4/1から2018/3/31までの日月の入った表があります。ボタンを押すと1年足されて2018/4/1から2019/3/31になる VBAを教えてください。
よろしくお願いします。

Aベストアンサー

ANo3です。

>この様場合どうすれば自動で2/29が入りますか。
データをシリアル値(=Date型)で持つようにしているなら、うるう年は自動的に2/29日が表示できます。
(前回回答の式の表示調整の仕組みをご覧ください)

それよりも、
>表は一月ごとに区切ってあります。
・・という条件は、ご質問文には記載されていませんでしたので、ANo3で提示した式はA列に一年分がズラ~っと並ぶ前提で作成した式になっています。
(うるう年はきちんと反映されますし、翌年度に当たるセルは空白になる関数式になっています)

ひと月ごとに区切って記載するのであれば話が全然違うので、各月用に式を作成し、その月の分だけ表示できる式にしておく必要がありますね。
(添付写真では部分的にしか見えませんが、小計の行やそれ以外にも異なる種類の行が間に入っているようですので…)

>2/28から3/1の間が4行空いてます
添付の写真では2/28から3/1の間は11行空いているように見えますが…???


>表は一月ごとに区切ってあります。
2月を例に考えれば、通常は28日までで以下は空白、うるう年は29日まで表示して以下は空白になれば良いものと解釈しました。(上記の「4行」云々は意味不明なので無視しています)
そのようにするには「その月の範囲」を条件にして、あとは空白になるようにしておけば良いです。
(ANo3は年度外は空白になるようにしてありますが、それを月単位にすれば良い)

例えば2月の場合の例を挙げるとして、
前回同様に、A1セルに平成年度が数値であるものと仮定すれば・・・
その先頭(2/1)のセルには
 =DATEVALUE("h"&$A$1&"/2/1")
次のセルには
 =IF(前のセル<DATEVALUE("h"&($A$1)&"/3/1")-1,前のセル+1,"")
として31日分フィルコピーすれば、ひと月分が表示されるはずです。
(「前のセル」とあるのは2/1を表示しているセル番地のことです)

上記の式だと12か月分に対して、月の部分を少しずつ変えた式を作成する必要がありますが、セル範囲に規則性があったり、月を示すタイトルがどこかにあるような場合は、それを利用することで全部の月で同じ関数式にすることも可能です。
などと言っているよりも、事前設定の1回こっきりの作業だと思いますので、個別に設定してしまった方が早いですし、2月以外は日数が固定なのでもっと簡単な式にでき、他の月に関しては、
 = 前のセル+1
という式で、必要な範囲にフィルコピーすれば十分なはずです。

ANo3です。

>この様場合どうすれば自動で2/29が入りますか。
データをシリアル値(=Date型)で持つようにしているなら、うるう年は自動的に2/29日が表示できます。
(前回回答の式の表示調整の仕組みをご覧ください)

それよりも、
>表は一月ごとに区切ってあります。
・・という条件は、ご質問文には記載されていませんでしたので、ANo3で提示した式はA列に一年分がズラ~っと並ぶ前提で作成した式になっています。
(うるう年はきちんと反映されますし、翌年度に当たるセルは空白になる関数式になっていま...続きを読む

Qこの連立方程式の解き方を具体的に教えて下さい(恥ずかしながら忘れてしまいました(泣)) 答えは書いて

この連立方程式の解き方を具体的に教えて下さい(恥ずかしながら忘れてしまいました(泣))
答えは書いてあるのですが、連立方程式の解き方がカットされていて……


よろしくお願いします。

Aベストアンサー

上の式を360倍します。
 2x+3y=4320

下の式は150倍して変形します。
 x+y=1800
 x=1800-y

このxの値を先の式に代入します。
 2(1800-y)+3y=4320
 3600-2y+3y=4320
 y=4320-3600=720

このyの値を3番目の式に代入します。
 x=1800-720=1080

x=1080、y=720です。

Q日付の年の確認方法について A1セルに2017/4/1 コンボボックスに2018/4/1 と入ってい

日付の年の確認方法について

A1セルに2017/4/1
コンボボックスに2018/4/1
と入っています。この両方の年だけ等しいか確認するには rang("a1").Format(Date, "yyyy")=コンボボックス.Format(Date, "yyyy")で大丈夫ですか。
よろしくお願いします。

Aベストアンサー

年の比較であれば、
year(セル)
です。

Qこの連立方程式の解き方を教えてください

この連立方程式の解き方を教えてください

Aベストアンサー

分数だから、ややこしく感じるのでしょうね。
上の式は両辺を15倍に、下に式は両辺を12倍してみて下さい。
①、② の様な整数の式になると思います。

3(2x+3y)=150ー5y ・・・①
9xー4(yー3)+12x=60 ・・・②

①を整理すると、6x+9y=150 ・・・③
②を整理すると、21x-4y=48 ・・・④

③、④ ここまでくれば、普通の連立方程式ですから
簡単に解けると思いますが。
 因みに、x=4,y=9 になると思いますが、計算は確認して下さいね。

Q時間の足し算をフォームでしたいのですが

何時も勉強させて頂いています。
今回は A3に時間 分をオープンイベントで
Range("A3").NumberFormat = "h 時 m 分"
Range("A3") = Now()
としています。
A3セルがアクティブになると現在の○○時○○分と表示したフォームが
出て進むボタンを押すと45分ごとに進む入力ボタンを押すとその値が
A3セルに入力される そんな事を実現させたいのです
ご指南ください。

Aベストアンサー

UserFormのInitializeまたはActivateで
TextBox1.Text = Format( range("A3").Value, range("A3").NumberFormat)
としておきます

ボタンのクリックイベントで
dim dt as Date
dt = TimeValue(TextBox1.Text)
dt = DateAdd( "n", 45, dt )
TextBox1.Text = Format( dt, Range("A3").NumberFormat)
Range("A3").Value = dt
といった具合でしょう
適切なエラー処理も付け加えましょう

Q連立方程式の解き方

 0.8x-0.6y=6500
 
 0.4y-0.2x=1400

の連立方程式の解き方と途中式を教えて下さい。

Aベストアンサー

係数が小数のままだと計算を間違えやすいので、
両辺を10倍なり100倍なりすることにより桁を上げます。

0.8x-0.6y=6500
両辺を10倍すると
8x-6y=65000
両辺を2で割ります。
4x-3y=32500・・・※1

0.4y-0.2x=1400
両辺を10倍すると
4y-2x=14000
みやすいように項を入れ替えます。
-2x+4y=14000
両辺を2で割ります。
-x+2y=7000・・・※2

※1と※2の連立方程式となります。

ここでは加減法で解いてみます。
(※1)+4×(※2)
4x-3y=32500
-4x+8y=28000

5y=60500
y=12100

y=5500を※2に代入
-x+2*12100=7000
-x=-17200
x=17200

よってx=17200,y=12100・・・答え

別解)代入法で連立方程式を解く
※2よりx=2y-7000・・・※3
これを※1に代入
4(2y-7000)-3y=32500
8y-28000-3y=32500
5y=60500
y=12100
これを※3に代入すると
x=2*12100-7000=17200

係数が小数のままだと計算を間違えやすいので、
両辺を10倍なり100倍なりすることにより桁を上げます。

0.8x-0.6y=6500
両辺を10倍すると
8x-6y=65000
両辺を2で割ります。
4x-3y=32500・・・※1

0.4y-0.2x=1400
両辺を10倍すると
4y-2x=14000
みやすいように項を入れ替えます。
-2x+4y=14000
両辺を2で割ります。
-x+2y=7000・・・※2

※1と※2の連立方程式となります。

ここでは加減法で解いてみます。
(※1)+4×(※2)
4x-3y=32500
-4x+8y=28000

5y=60500
y=12100

y=5500を※2に代入
-x+2*12100=7000...続きを読む

Q[VB.NET] テキスト出力で困ってます(T△T

すいません、教えて下さい。
Byte型で読み込んだ内容を指定した固定長で出力したいです。
例えば、次のテキストファイルがあります。

【読み込み元.txt】
-------------------------------------------------------
ABC123
-------------------------------------------------------

文字コードをSJISとしてバイナリ値では「41 42 43 31 32 33」となります。
この値を次のように出力したいです。

【出力先.txt】(3バイト区切りとする)
-------------------------------------------------------
414243
313233
-------------------------------------------------------

なんとか自力で近しい?とこまで行けたのかなと思いますが
肝心の出力がうまくいきません。

【VB.Net】
-------------------------------------------------------
Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ
Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ
Dim readSize As Integer ' Readメソッドで読み込んだバイト数
Dim srcName As String = "C:\Temp\A.txt" ' 読み込み元
Dim detName As String = "C:\Temp\B.txt" ' 出力先

' 処理開始
Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read)
Using dest As New FileStream(destName, FileMode.Create, FileAccess.Write)
While True

' 読み込み
readSize = src.Read(buf, 0, BUFSIZE)

' 読み込むものが無ければ終了
If readSize = 0 Then Exit While

' 直接16進数を指定固定長で書き込みしたい部分
For i As Integer = 0 To readSize - 1
msgbox buf(i)
Next

' 書き込み実行
dest.Write(buf, 0, readSize)

End While
End Using
End Using
-------------------------------------------------------

大変お手数ですがご教示頂ければと思います。

すいません、教えて下さい。
Byte型で読み込んだ内容を指定した固定長で出力したいです。
例えば、次のテキストファイルがあります。

【読み込み元.txt】
-------------------------------------------------------
ABC123
-------------------------------------------------------

文字コードをSJISとしてバイナリ値では「41 42 43 31 32 33」となります。
この値を次のように出力したいです。

【出力先.txt】(3バイト区切りとする)
-------------------------------------------------------
414243
31323...続きを読む

Aベストアンサー

入力ファイルの各バイトを
ただ単純に16進数表記で出力するプログラムです。
適当に改造すれば目的のこともできるでしょう。

========================================
' インデントに全角空白を使っています。要削除。

Class Bin2HexText
 Shared Sub main(ByVal args As String())

  Dim srcName As String = args(0) ' 入力ファイル名
  Dim destName As String = args(1) ' 出力ファイル名

  Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ
  Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ

  Dim readSize As Integer ' Readメソッドで読み込んだバイト数

  Using src As New System.IO.FileStream( _
    srcName, System.IO.FileMode.Open, System.IO.FileAccess.Read)
   ' 出力ファイルはテキストファイルとして扱う
   Using dest As New System.IO.StreamWriter( _
     destName, False, System.Text.Encoding.GetEncoding("shift_jis"))

    While True
     readSize = src.Read(buf, 0, BUFSIZE) ' 読み込み

     If readSize = 0 Then
      Exit While ' 完了
     End If

     For i As Integer = 0 To readSize - 1
       ' Byte型数値を16進数表記(文字列)に変換して出力
       dest.Write( String.Format("{0:X2} ", buf(i)) )
     Next

    End While
   End Using
  End Using
 End Sub
End Class

入力ファイルの各バイトを
ただ単純に16進数表記で出力するプログラムです。
適当に改造すれば目的のこともできるでしょう。

========================================
' インデントに全角空白を使っています。要削除。

Class Bin2HexText
 Shared Sub main(ByVal args As String())

  Dim srcName As String = args(0) ' 入力ファイル名
  Dim destName As String = args(1) ' 出力ファイル名

  Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ
  Dim buf(BUFSIZE) As Byte ' 読み込み用バッ...続きを読む


人気Q&Aランキング

おすすめ情報