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

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

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

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

Q&A

解決済

3回答

6278閲覧

Java 2つの数字m,nを入力して、mからnまでの和

yk-211

総合スコア34

Java

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

0グッド

0クリップ

投稿2015/05/19 00:55

package test;

import java.io.*;
public class Mondai5{
public static void main(String args[]) throws IOException{
BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
System.out.print ("m=");
int m,n;
m=Integer.parseInt(a.readLine());
System.out.print ("n=");
n=Integer.parseInt(a.readLine());
System.out.print ("mからnまでの和=");
System.out.println(f(m,n));
}
public static int f(int m,int n){
if(n-1>=m){
n+=f(m,n-1);
}else{
return(m);
}
return(n);
}
}


と作成し、mからnまでの和はしっかり表示されております。
しかし、mの方が数値が大きい場合の和の表示はどのようにしたら
出来ますでしょうか。

よろしくお願いいたします。

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

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

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

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

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

swordone

2015/05/19 01:05

mのほうが大きい場合,どうしたいのですか? 1.大小入れ替え,小さい方から大きい方への和を出す 2.mを返す 3.エラーを表示する 4.その他
yk-211

2015/05/19 01:06

そちらが抜けており申し訳ございません。 小さいほうから大きいほうへの和を出したいです。
guest

回答3

0

ベストアンサー

正直に言うと,なんでこんな面倒なことをしているのかと思いました.
質問の答えとしては,「単純にmとnを入れ替えればいい」です.

lang

1if(m > n){ 2 int temp = n; 3 n = m; 4 m = temp; 5}

ただ,なんで無駄に再帰を使っているのかと思います.(課題等で再帰を使うよう指定されている場合は以下は読み流して下さい.)
普通にforで足したほうがわかりやすいと思ったのですが

lang

1public static int f(int m,int n){ 2 if(m > n){ 3 int temp = n; 4 n = m; 5 m = temp; 6 } 7 int result = 0; 8 for( ; m <= n; m++){ 9 result += m; 10 } 11 return result; 12}

あるいは単純にmとnとその間の整数の和を出すのであれば,入れ替えずとも公式で導くこともできます.

lang

1public static int f(int m,int n){ 2 return (Math.abs(m - n) + 1) * (m + n) / 2; 3}

投稿2015/05/19 01:17

編集2015/05/19 01:24
swordone

総合スコア20649

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

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

yk-211

2015/05/19 01:27

ありがとうございました。 確かにおっしゃるとおり無駄に再帰を使っておりました・・・
guest

0

質問文でのコードは
f(x, y) = f(x, y - 1) + y
f(x, x) = x
の関係を使ってます。(y の方しか変化していきません)

x 側も変化する関係をコードにくみこむ必要があります。

f(n, n) = n
f(0, y) = f(0, y - 1 ) + y
f(x, 0) = f(x - 1, 0) + x
f(n, m) = m + f(n, m - 1) (m < n)
f(n, m) = n + f(n + 1, m) (m > n)
この関係をプログラムにしてみました。

lang

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class Sample { 6 7 public static void main(String args[]) throws IOException { 8 BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); 9 System.out.print("m="); 10 int m, n; 11 m = Integer.parseInt(a.readLine()); 12 System.out.print("n="); 13 n = Integer.parseInt(a.readLine()); 14 System.out.print("mからnまでの和="); 15 System.out.println(f(m, n)); 16 } 17 18 public static int f(int m, int n) { 19 System.out.println("m=" + n + ", m=" + m); 20 if ( n == m) { 21 return n; 22 } else if (0 == m) { 23 return f(n - 1, 0) + n; 24 } else if (n == 0) { 25 return f(0, m - 1) + m; 26 } else if (m < n) { 27 return m + f(m + 1, n); 28 } else { 29 return m + f(m - 1, n); 30 } 31 } 32}

このコードでは f(1,4) も f(4,1) もどちらも 10 の値が求まりました。

別の考えかたもあります。
f(x, y) + f(y,x) を考えてみます。
x = 2, y = 3 とすると
f(2, 4) は図にすれば
OO
OOO
OOOO

f(4,2) は 図にすれば
XXXX
XXX
XX

これを 下のように組み合わせると
OOXXXX
OOOXXX
OOOOXX

つまり、f(2, 4) + f(4, 2) は長方形の面積になります。
長方形の面積は (4+1) * (abs(4-1) + 1) です。

f(x, y) = f(y, x) ですから、
f(x, y) + f(y, x)
= 2 * f(x, y)
= (x + y) * (abs(x - y) + 1)

つまり、
f(x, y) = (x + y) * (abs(x - y) + 1) / 2
と 直接 計算できます。

投稿2015/05/19 15:56

katoy

総合スコア22324

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

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

0

こんにちは。

lang

1System.out.println(f(m,n));

で、合計を求めるメソッドを、f(m,n)と呼んでいるところを

lang

1f( Math.min(m,n), Math.max(m,n))

とされてみてはいかがでしょうか。

それと、

System.out.print ("mからnまでの和=");

のところについても、m のほうが大きい場合も考慮すると、以下にすればよいと思います。

lang

1System.out.print ( (n >= m ? "mからn" : "nからm") + "までの和=");

ご参考になれば幸いです。

投稿2015/05/19 01:20

jun68ykt

総合スコア9058

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問