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

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

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

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

アルゴリズム

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

Q&A

解決済

2回答

1584閲覧

Javaでガウスの公式を用いた足し算のプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

アルゴリズム

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

0グッド

0クリップ

投稿2018/01/22 12:40

編集2018/01/22 12:41

###前提・実現したいこと
ガウスの定理(以下のような方法)を用いて、1から入力した数nまでの和を求めて表示するプログラムを書いています。

1から10までの和 (1+10)*5

###発生している問題・エラーメッセージ
エラーなどは起こっていないのですが、これが最適解かどうか意見をお聞きしたいです。もしより良いアルゴリズムがあれば教えていただけますと幸いです。

###該当のソースコード

Java

1package javaalgorithm; 2import java.util.Scanner; 3 4public class ex1_1_8 { 5 public static void main(String[] args) { 6 Scanner stdIn = new Scanner (System.in); 7 System.out.println("1からnまでの和を求める。"); 8 System.out.print("nの値:"); 9 int n = stdIn.nextInt(); 10 11 int sum = 0; 12 if(n%2 == 0){ 13 sum = (1+n)*(n/2); 14 }else{ 15 sum = (1+n)*(n/2)+(n/2+1); 16 } 17 System.out.print(sum); 18 19 } 20 21} 22stdIn.close()

###補足情報(言語/FW/ツール等のバージョンなど)
Eclipse Java EE IDE for Web Developers.
Version: Neon.3 Release (4.6.3)

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

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

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

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

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

guest

回答2

0

ベストアンサー

int sum = n * (n + 1) / 2;
でよいですよ?

nと(n+1)はどちらかが偶数になりますからそれを乗じた結果はかならず偶数になります。


余談:

1から10までの和
(1+10)*5

というのがガウスの定理の表現だとしたら少々一般性に欠ける記述と言えそうです。

1からN(ただしN>=1)までの和
(1+N)*N/2
と書いてあったのではないでしょうか。

元の記述だと1とか10とか5などの数値が一体なにを指しているのか分かりにくいですよね?

投稿2018/01/22 12:47

編集2018/01/22 12:48
KSwordOfHaste

総合スコア18392

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

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

退会済みユーザー

退会済みユーザー

2018/01/22 12:50

ご回答いただきましてありがとうございます。 使用している参考書の記述が 1から10までの和 (1+10)*5 となっていたのでそのように明記してしまいました。ご指摘ありがとうございます。
KSwordOfHaste

2018/01/22 13:20

なるほど・・・何が分かり易い記述なのか考えさせられますね。
guest

0

質問文のプログラムでは、 n が偶数、奇数で場合分けをしています。
でも
sum = n * (n + 1) / 2;
とすれば、場合分けは不要です。

1, 2, ... n の和は、

(n + 1 ) n ------------ 2

と数式では書かれていると思います。
これをプログラムで表すときに、次の 2 つの文は、数式としては同じようにおもえます。
でも実際には計算結果が異なってしまいます。

a. (n + 1) * n / 2
b. (n + 1) * (n / 2)

a では (n + 1) * n を計算してから 2 で割ります。
b では (n + 1) と n / 2 を掛けます。

java では、 整数 / 整数 の計算結果は、小数点以下が切捨てられてしまいます。
2 / 2 は, n 奇数のときは、小数点以下が切捨てられてしまうので、 sum の計算結果がすこし小さくなってしまうのです。
(電卓などで計算するときは、小数点は切捨てられない)

n / 2 の部分で小数点以下も計算したいなら、 (1.0 * n) / 2 とします。
(他にもいろいろ書き方はありますが)
これは double 型 / 整数なら、小数点以下も計算されることを利用しています。
(1.0 * n とすることで、 double型になります)

次にプログラムを実行して、この2つの計算式の差、double 型で計算したときとの差を試してみてください。

java

1import java.util.Scanner; 2 3public class ex1_1_8_x { 4 public static void main(String[] args) { 5 Scanner stdIn = new Scanner(System.in); 6 System.out.print("nの値:"); 7 int n = stdIn.nextInt(); 8 System.out.println(((n + 1) * n) / 2); 9 System.out.println((n + 1) * (n / 2)); 10 System.out.println((n + 1) * (1.0 * n / 2)); 11 } 12}

実行例
イメージ説明

投稿2018/01/22 13:56

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2018/01/23 03:17

ご丁寧にご回答をいただきましてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問