質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

3903閲覧

java つるかめ算で一意に定まらないときのアルゴリズム

kinako_make

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/10/23 00:45

鶴と亀の足の合計
鶴と亀の合計
鶴の足の本数
亀の足の本数

の4つの数値が入力されます。

推定される鶴と亀の引数を出力したいです。
ただし、どちらか一方でも正の整数にならない場合や、一意に定まらない場合は”miss”と出力したいです。

現在、つるかめ算に当てはめできたのですが、下記の例の3番だけ出力結果だけ(1 3と出力され)違います。
多分一意に定まらないと場合というだと思うのですが、考え方がわかりません。

1 入力 32 10 2 4 出力 4 6 2 入力 52 65 18 76 出力 miss 3 入力 12 4 3 3 出力 miss 4 入力 2 2 1 1 出力 1 1

import

1 2 3public class Main { 4 public static void main(String[] args) { 5 6 Scanner sc = new Scanner(System.in); 7 8 int sumLegs = sc.nextInt(); //鶴と亀の足の数の合計 9 int sum = sc.nextInt(); //鶴と亀の頭の数 10 11 int turuLegs = sc.nextInt(); //鶴足の数 12 int kameLegs = sc.nextInt(); //亀足の数 13 14 //つるかめ算から亀を求める 15 int kame = sum * turuLegs; 16 17 kame = sumLegs - kame ; 18 19 if(kameLegs > turuLegs){ 20 kame = kame / (kameLegs - turuLegs); 21 }else if(turuLegs > kameLegs){ 22 kame = kame / (turuLegs - kameLegs); 23 }else if(kameLegs == turuLegs){ 24 kame = kameLegs; 25 } 26 27 int turu = sum - kame; 28 29 //結果の表示 30 if(kame < 0 || turu < 0){ 31 System.out.println("miss"); 32 }else{ 33 System.out.println(turu + " " + kame); 34 } 35 36 } 37}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/23 01:24

どのような計算を行うのでしょうか? 一般的な鶴亀算は、「鶴と亀の足の合計」と「鶴と亀の合計」しか与えられません。
guest

回答1

0

ベストアンサー

鶴x匹、亀y匹とします。
鶴の足、亀の足というのは、通常の鶴亀算において通常4本と2本に固定されているものが、
条件として与えられるという事ですね?これをa,bとします。
解くべきは連立方程式
x+y=sum
ax+by=sumLegs
という事になります。ifに入るまででやっていることは、
上の式をa倍して下の式から引く、という事になります。
これにより導かれる式は
(b-a)y=sumLegs-asum …()
という事になります。この時点の右辺が変数kameに格納されていることになります。
(正直、変数の使いまわしがひどいです。別の変数を定義するべきです。)

(*)で、両辺をb-aで割ることができれば、y,すなわち亀の数を求められることになるのですが、
これが0、つまりa=bである場合に、割ることができなくなります。
3番はこの時に該当し、この時の処理に問題があります。

この時の右辺が0以外である場合、yがいかなる値でも(*)は成り立ちません。つまり「解なし」となります。
右辺が0である場合、最初の連立方程式の2式は同じ式という事になり、
「x+y=sum」のみの方程式という事になります。
一般にこの式の解は一意に定まらないのですが、「x,yが正の整数」という条件であれば、
唯一、「sum=2」の場合のみ、「x=1,y=1」に定まります。

つまり問題は、a=bの場合は基本的にx,yが定まらないはずなのに、yを決定してしまっている点にあります。
4番もこの「a=b」に該当しますが、たまたまsum=2かつkameLegs=1だったので、合ってしまったのです。

a=b以外の場合も、なぜaとbの大小で分けているのかわかりません。いずれの場合もb-aで割ればいいだけで、勝手にa-bで割ったりすると合わなくなります。1番のケースはたまたま本筋のb-aで割るケースに入るので、問題は顕在化していませんが。

投稿2020/10/23 01:23

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinako_make

2020/10/23 03:03

詳しくありがとうございます。 つるかめ算を理解できておらず、 b-aで0になるとArithmeticExceptionにならないようにとaとbの大小で分けていました。 ほかにもその場限りの解決方法で根本的な解決はできていなかったのですね。 アドバイスを元につるかめ算を考え直してみましたが、こういうことでしょうか? int kame = sumLegs - (turuLegs * sum); if((kameLegs - turuLegs) != 0){ kame = kame / (kameLegs - turuLegs); }else if(sum == 2){ kame = kameLegs; } int turu = sum - kame;
swordone

2020/10/23 05:00 編集

・割る数が0でない場合で、右辺が割り切れない場合は? ・割る数が0のときの処理、ちゃんと理解していますか?
kinako_make

2020/10/23 04:52

割り切れない場合につて、思いつきませんでした。ありがとうございます! 割る数が0のときの処理というのは、その時点で「解なし」ということだと思ったのですが、 違いますか?
swordone

2020/10/23 04:59

「基本的には」決まらない、と私は回答したはずです。そして、言ってることとやってることが違いますよ?
kinako_make

2020/10/23 06:42

すみません、よくわかりません。 亀、鶴ともに最低は1匹はいる条件なので、亀が0の時点で最終的にはmissの条件に入るので 鶴の数はどんな数値でもいいと思いました。 //つるかめ算から亀を求める int kame = sumLegs - (turuLegs * sum); int calc = kameLegs - turuLegs; //足の本数の差 if(kameLegs != turuLegs) { if(kame % calc == 0){ //足の本数が同じではなく割り切れる場合 kame = kame / calc; }else{ //割り切れない場合は、浮動小数点数で一意に定まらない kame = 0; } }else if(sum == 2){ //同じ足の本数でも合計が2の場合だけOK kame = kameLegs; }else{ kame = 0; } int turu = sum - kame; //結果の表示 if(kame <= 0 || turu <= 0){ System.out.println("miss"); }else{ System.out.println(turu + " " + kame); }
momon-ga

2020/10/23 06:53

ax+by=sumLegs の条件x、yが1なので、(a+b=sumLegs)の条件確認が必要なのと ※missと表示するものが、「1 1」と表示される kame = kameLegsは、kameLegsが1以外の場合、結果おかしいですよね。 「4 2 2 2」が「1 1」にならない
swordone

2020/10/23 07:14

まず、紙の上で連立方程式を解いてみてください。 そうしないと話が進みません。
kinako_make

2020/10/23 08:01

swordoneさん、momon-gaさん ありがとうございます。 一から紙に書いて計算してみました。 やはりちゃんとわかっていなかったのがわかりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問