Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

直角三角形になる組み合わせを複数出力するプログラム

今javaの勉強をしているのですがどうしても
[3つの自然数を3編とする三角形が直角三角形になる組み合わせを20個かけ」(ただし掃除関係の三角形は除く)
という問題ができません。
よろしければ教えていただけないでしょうか?

私が勉強して知っていることは
if for else while break 配列 indexof substring math.randm equals System.out.println
メインメソッド以外のメソッドを自分で作る
などといったことを学びました。

今回の問題についてはifとelseや
a=b+c || b=a+c || c=a+b
を使うのだとは思っているのですが(a,b,cは自分で入力)
これらの変数をどう変えていくかがわからなくて苦しんでいます。

11

回答

4437

閲覧

11件の回答

評価

0

ガイドラインは読みましたか?

誤字があるのが気になりますが置いておいて、



>3つの自然数を3編とする三角形が直角三角形になる組み合わせを20個

これを普通に数式で求められますか?

判らないのは、javaの書き方?
それとも、数学的なお話?

評価

0

ガイドラインは一通り読みました。
宿題ではありません。
回答の丸投げにしないように
「a=b+c」などを書いておいてはいたのですが
これではやはり丸投げ状態と同じようなものだったかもしれません。すいません。
この問題をとくメインとなる部分はわかりませんが一応書いておきます。
import java.io.*; //入力するときは必要
class tyokkakusannkakkei {
 public static void main(String[] args)
    throws IOException{
    BufferedReader br =new BufferedReader(
                          new InputStreamReader(System.in));
    
    System.out.println("3つの自然数を入力しなさい");//プロンプト
    String line=br.readLine();                        //文字列入力
    int a=Integer.parseInt(line);                   //整数aに変換
      
    line =br.readLine();                             //文字列入力
    int b =Integer.parseInt(line); 

    line =br.readLine();                             //文字列入力
    int c =Integer.parseInt(line);

わからないのは、javaの書き方?
それとも、数学的なお話」とのことですが
わからないのはこの問題を解く上での考え方です。
たとえば1から10までの和を求めよという問題なら
1+2をたし次に3を足しと考え方がわかるので
for(int i=1;i<=10;i++){
sum=sum+i;
}
などのようにプログラムがかけるのですが
今回は考え方がよくわからないのでプログラムが書けないです。
javaの基本的な書き方は上にも書いたように少しは知っています。

失礼な点がありましたらすいません。

評価

0

ガイドラインは読みました。
宿題ではありません。
やはりこれでは丸投げで失礼だったでしょうか?
一応
「今回の問題についてはifとelseや
a=b+c || b=a+c || c=a+b」とは書きましたが丸投げ同然ですかね・・・

「判らないのは、javaの書き方?
それとも、数学的なお話」
とのことですが、このプログラムを考えるうえでの考え方がわからないです。
これは数学的な話でしょうか・・・

javaの基本的な書き方は知っているつもりではあります。
参考程度に自分で書いたプログラムを載せますね

評価

0

すいません
01:12のはきにしないでください。

評価

0

> これらの変数をどう変えていくかがわからなくて苦しんでいます。

「条件文をどのように修正したらいいかわからない」
ということでしたらピタゴラスの定理を利用します。


> (a,b,cは自分で入力)

そうなんですか?

評価

0

すいません。2剰をつけるのを忘れていました。
a*a=b*b+c*c || b*b=a*a+c*c || c*c=a*a+b*b
上の式を使えば直角三角形であるかどうかを調べることができることはわかっています。
しかし、上の式をみたすものを、20個出力しなければいけないので、abcの値を変えて、式を満たすものを探さなければいけませんよね?
その部分の考え方がわからないです。

それと、よく考えたら今回は手入力式型でないほうがいいかもしれません。というより手入力型にしてはできないかもしれません。

class tyokkakusannkakkei {
 public static void main(String[] args){
int a,b,c=0;
でとりあえず下準備はよさそうですね。

ということで、abcは自分で手入力するものではありません。


        
   

評価

0

とりあえず今できたものを載せますね。
import java.io.*; //入力するときは必要
class tyokkakusannkakkei {
    public static void main(String[] args)
    throws IOException{
    BufferedReader br =new BufferedReader(
                          new InputStreamReader(System.in));
    System.out.println("3辺の中で一番大きいものを入力");
    String line=br.readLine();                        //文字列入力
    int c=Integer.parseInt(line);                   //整数cに変換

    int a=1,b=1;
    for(a=1;a<c;a++){
        for(b=1;b<c;b++){
        if(a*a+b*b==c*c){
//直角三角形であるなら
            System.out.println("("+a+","+b+","+c+")");
//abcの値を出力する    
    }
        }
    }
    }
}
これで一応、cの値を入力すれば直角三角形の組み合わせが出力されるようになりました。
例として5と入力すれば(3,4,5)と出力されます。
1など組あわせがないものは何もでません。

改善したい点は20個の組み合わせがでるまでcを入力しなければいけない点と相似関係にある組み合わせも出力されてしまう点です。
私が望んでいるのはこのプログラムを実行すると
(3,4,5)
(5,12,13)
(7,24,25)
(8,15,17)
(9,40,41)
(11,60,61)
(12,35,37)
(13,84,85)
(15,112,113)
(16,63,65)
(17,144,145)
(19,180,181)
(20,21,29)
(20,99,101)
(21,220,221)
(24, 143, 145)
(28,45,53)
(28, 195, 197)
(33,56,65)
(36,77,85)
と、出力されるプログラムです。

改善するべき点と、付け加える点があれば教えてください。


評価

0

> for(b=1;b<c;b++){

bは1からはじめる必要はありません。
cも入力する必要はないでしょう。


相似は、既に出力したものを記憶しておいて
それらと照らし合わせるしかないんじゃないでしょうか。

評価

0

bは4から始めるとして、
cについてはどうすればいいでしょうか?
初期値は5以下ならいいとして、ある数に固定してはいけないのでcの値もc++などで変化させる必要があると思うのですが、そこらへんをどうすればいいのかわからないです。
どこにc++を付け加えればうまくいくか。

「相似は、既に出力したものを記憶しておいて
それらと照らし合わせるしかないんじゃないでしょうか。」
とのことですが、(3,4,5)と(6,8,10)は相似関係にあってもこれらをどう比較すればいいかもわかりません。

私の考えでは()の中の数字の最大公約数を求めて、
最大公約数が1のときのみ出力するようにすればいいと思うのですが、3変数の最大公約数を求めるやり方がまたわからなくお手上げ状態です。
ちなみに2変数の最大公約数を求めるプログラムは書けました。以下のものがそれにあたります。
import java.io.*; //入力するときは必要
class koubaisuu {
    public static void main(String[] args)
         throws IOException{
    BufferedReader br =new BufferedReader(
                          new InputStreamReader(System.in));
    System.out.println("1つ目の数字を入力してください");//プロンプト
    String line=br.readLine();                        //文字列入力
    long a=Integer.parseInt(line);                   //aは○○以上

    System.out.println("2つめの数字を入力してください");//プロンプト
    line =br.readLine();                             //文字列入力
    long b =Integer.parseInt(line);               //倍数用の変数
    
    
    long d=koubaisu(a,b);
    System.out.println(a+"と"+b+"の最大公約数は"+d+"です。");    
    System.out.println(a+"と"+b+"の最小公倍数は"+a*b/d+"です。");
}
    static long koubaisu(long a,long b){
    long tmp=0;
    
    while(a%b !=0){
        tmp=b;
        b=a%b;
        a=tmp;
       
    }
    return b;    
    }
}

評価

0

ガイドラインは読みましたか?(二度目

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220701482


マルチポストをなぜするの?

評価

0

> bは4から始めるとして

固定させるのではなく動的に変えていくことで
並び順が違うだけのものを排除できます。

> cについてはどうすればいいでしょうか?

for文が現在は2つですが、3つをネストして
その3つ目でインクリメントします。
cも動的に初期値を変えていきます。

> (3,4,5)と(6,8,10)は相似関係にあってもこれらをどう比較すればいいかもわかりません。

規則性がありますので、それをもとに判定します。

> 最大公約数を求めて

とくに求める必要はないと思います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。