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

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

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

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

Q&A

解決済

3回答

1844閲覧

Java プログラムについて、 val1からval2(両方とも自然数)までのすべての整数、偶数、奇数の足し算をしたいです

sylvia1na

総合スコア6

Java

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

0グッド

0クリップ

投稿2019/09/28 00:32

Java プログラムについて、

val1からval2(両方とも自然数)までのすべての整数、偶数、奇数の足し算をしたいですが、

一番最初のメソッドには、「0」→整数の足し算、「1」→偶数の足し算、「2」→奇数の足し算
上述のように設定したいですがどういうふうに書けばいいかわかりません。

つまり、実行結果のところに「val1、val2、0」を打てばすべての整数の足し算をしてくれる、そして「val1、val2、1」を打てばすべての偶数の足し算をしてるプログラムを作りたいです。

今はこれしか書けてないです。
public class Step2
{
public static viod main(String[]args)
{

int i,sum,sum1,sum2;

sum=0;
sum1=0;
sum2=0;
for(i=1;i<=100;i++){
sum+=i;
if(i%2==1)sum1+=i;
if(i%2==0)sum2+=i;
}

printf("1から100までの総和=%d\n",sum);
printf("奇数だけの総和=%d\n",sum1);
printf("偶数だけの総和=%d\n",sum2);

}
}

メソッドの部分、つまり
「0」→整数の足し算、「1」→偶数の足し算、「2」→奇数の足し算
この設定をどう書けばいいですか?教えてください!!よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

和の公式

自然数の和 (1 から n) n個 : n * (n + 1) / 2
偶数の和 (2 から 2n) n個 : n * (n + 1)
奇数の和 (1 から 2n-1) n個 : n ^ 2

ラムダ式

和の公式をラムダ式で表します。どれも 1 から n までの和。

Java

1n -> n*(n+1)/2 // 自然数 2n -> (int)Math.pow(Math.ceil(n/2.0), 2)) // 奇数 3n -> (n/2)*(n/2)+(n/2) // 偶数

合成関数

x から y までの和は、和(y) - 和(x - 1)だから。

Java

1BiFunction<Integer,Integer,Integer> rangeSum(IntFunction<Integer> f) { 2 return (x,y) -> f.apply(y) - f.apply(x-1); 3}

和の計算

1から5までの和の計算。1から1、2から2でも正しく計算します。

Java

1rangeSum(n -> n*(n+1)/2).apply(1,5); // 自然数 2rangeSum(n -> (int)Math.pow(Math.ceil(n/2.0), 2))).apply(1,5); // 奇数 3rangeSum(n -> (n/2)*(n/2)+(n/2)).apply(1,5);// 偶数

訂正 2019-10-08
奇数の和の範囲の誤りを訂正しました。
diffの名称をrangeSumに変更しました。

追記 2019-10-08

合成関数(y < x にも対応)

Java

1BinaryOperator<Integer> maxBy = BinaryOperator.maxBy(Integer::compare); 2BinaryOperator<Integer> minBy = BinaryOperator.minBy(Integer::compare); 3BiFunction<Integer,Integer,Integer> rangeSum(IntFunction<Integer> f) { 4 return (x,y) -> f.apply(maxBy.apply(x,y)) - f.apply(minBy.apply(x,y)-1); 5}

和の計算

Java

1rangeSum(n -> n*(n+1)*(2*n+1)/6).apply(1,5); // 自然数の二乗の和 2rangeSum(n -> (int)Math.pow(n*(n+1)/2, 2)).apply(1,5); // 自然数の三乗の和 3

投稿2019/09/28 07:26

編集2019/10/08 10:49
xebme

総合スコア1083

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

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

sylvia1na

2019/10/08 21:56

確認が遅くなり、申し訳ありません。ありがとうございます!
xebme

2019/10/10 09:21

和の公式に適用できる高階関数の例をあげてみました。しかし、Javaの関数インターフェイスは使いにくいです。追記したらカリー化も必要か?ツッコミどころの多い解答で申し訳ありません。
guest

0

入力が1なら偶数の和を、2なら奇数の和を、0なら偶数の和と奇数の和の合計をそれぞれ出力すればいいのでは?

投稿2019/09/28 07:20

swordone

総合スコア20651

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

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

sylvia1na

2019/09/28 11:06

そうです!とりあえず入力が1なら偶数の和を、2なら奇数の和を計算させてほしいですね。一番最初のメソッドはどういうふうに書けばいいかわかりません....
swordone

2019/09/28 13:09

いや、和は求められてるんだから、あとは入力を判別するだけでは?
guest

0

for文を使わずにIntStream.rangeClosed(start, end).filter(pred).sum()とすればいいと思います。

Java

1import java.util.function.IntPredicate; 2import java.util.stream.IntStream; 3import java.util.Scanner; 4 5public class prog { 6 public static int calcSum(int start, int end, IntPredicate pred) { 7 return IntStream.rangeClosed(start, end).filter(pred).sum(); 8 } 9 public static void main(String[] args) { 10 var sc = new Scanner(System.in); 11 while (true) { 12 var start = sc.nextInt(); 13 var end = sc.nextInt(); 14 var cond = sc.nextInt(); 15 String str = null; 16 IntPredicate pred = null; 17 switch (cond) { 18 case 0: 19 str = "全体"; 20 pred = i -> true; 21 break; 22 case 1: 23 str = "偶数"; 24 pred = i -> i % 2 == 0; 25 break; 26 case 2: 27 str = "奇数"; 28 pred = i -> i % 2 != 0; 29 break; 30 default: 31 System.out.println("指定外のため終了します。"); 32 return; 33 } 34 var result = calcSum(start, end, pred); 35 System.out.printf("%dから%dの%sの総和は%dです。\n", start, end, str, result); 36 } 37 } 38}

wandboxでの実行結果

投稿2019/09/28 01:22

raccy

総合スコア21735

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問