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

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

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

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

Q&A

解決済

3回答

11646閲覧

while文の中で桁数を求める処理について

bonobiya

総合スコア15

Java

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

0グッド

0クリップ

投稿2017/03/05 11:20

javaの問題集で
「正の整数値を読み込んで、その桁数を出力するプログラムを作成せよ」
(たとえば9999と入力したら
『4桁』
という表示がされるプログラムを作成せよ)
という問題の模範解答を見たのですが、while文の中で桁数を求めている箇所で
なぜそれで正解なのかわからなかったので、どなたかご解説いただけないでしょうか?

模範解答のコードは以下です。

java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner stdIn = new Scanner(System.in); 6 7 System.out.println("正の整数値の桁数を求めます。"); 8 int n = stdIn.nextInt(); 9 System.out.println("正の整数値:"+n); 10 11 int keta = 0; 12 while(n > 0){ 13 keta ++; 14 n = n / 10; 15 } 16 System.out.println("その数は"+keta+"桁です"); 17 18 } 19} 20

入力値に9999と入力した場合、while文に入り
n = n / 10 ;
の箇所で最初に
n = 999.9
となりその後、n = 99.99
n = 9.999
n = 0.9999
n = 0.09999 となっていくと思うのですが、いつになってもnが0未満にならず、**while(n > 0)**の式から抜けない気がするのですが・・・。

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

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

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

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

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

guest

回答3

0

ベストアンサー

nint型なので、整数しか入りません。そして、正の整数同士の割り算では、結果は切り捨てになるので、9999→999→99→9→0で、きちんと0になります。

投稿2017/03/05 11:24

maisumakun

総合スコア145183

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

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

0

理由は maisumakun さんのおっしゃる通りだと思います。

完全に余談なのですが、桁数を求める際にあまりループは使わないと思います。
以下のようにすることが多いのではないでしょうか?
ただ、質問のソースは 0 の桁数を 0 と出力するのに対し、以下のソースでは -2147483647 と出力します。0 の桁数は定義されていないので、どちらも正解ではありません。実際に使う場合は例外を投げましょう。

Java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner stdIn = new Scanner(System.in); 6 7 System.out.println("正の整数値の桁数を求めます。"); 8 int n = stdIn.nextInt(); 9 System.out.println("正の整数値:"+n); 10 System.out.println("その数は" + (((int)Math.log10(n)) + 1) + "桁です"); 11 } 12}

投稿2017/03/05 12:03

Zuishin

総合スコア28660

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

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

swordone

2017/03/05 12:08 編集

これもどうなんだ…除算でこういうループで桁数を出すのはそんなにないことではないと思う。
Zuishin

2017/03/05 12:08

もちろん、0 は正の整数ではないので、この問題では対処する必要はありません。
Zuishin

2017/03/05 12:10

swordone さん、0 の桁数はどこで定義されていますか?
swordone

2017/03/05 12:12

すいません、書いた後自分で調べたら定義されていない旨ありました… コメントの編集が入れ違いになり、申し訳ありません。
Zuishin

2017/03/05 12:12

了解しました。
Zuishin

2017/03/05 12:21

後でよく考えてみたら、「ループはあまり使わない」のソースは私の頭の中でした。ループを使って計算した方が早くなる可能性もあります(計ってない)から、撤回します。
guest

0

int n = 0;
のところで、変数ketaは整数(インテジャー)しか記憶しないように決められます。
したがって、演算においても10で割っていく整数型の演算においては、元の1の桁の値は捨てられていくので、その答が0になるまでの1の桁が捨てられる回数が桁数になります。

投稿2017/03/05 11:27

編集2017/03/05 12:07
seastar3

総合スコア2285

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

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

KiyoshiMotoki

2017/03/05 11:47

「代入する変数の型が整数型だから、小数部が捨てられる」 というわけではありません。 Java の場合、整数型に浮動小数を代入することはできないからです。 ■ソースコード  public class Main {   public static void main(String[] args) {   int keta = 999.9;   }  } ■コンパイル結果  Main.java:3: 精度が落ちている可能性  検出値 : double  期待値 : int   int keta = 999.9;   ^  エラー 1 個 maisumakun様の回答の通り、 「正の整数同士の割り算では、結果は切り捨てになる」 が正しいです。
seastar3

2017/03/05 11:57

KiyshiMotokiさん、ご指導どうもありがとうございます。 プログラム例のように、厳密には、おっしゃるとおり整数型の演算が整数しか返さないのですね。 表現を改めます。
swordone

2017/03/05 12:03

ここで変数ketaって全く関係ないですよね? 問題はn(とリテラル10)の型なのであって。
seastar3

2017/03/05 12:07

swordoneさん、ご指摘ありがとうございます。 本当に見間違いで済みません。kataをnに直します。
KiyoshiMotoki

2017/03/05 12:26 編集

seastar3様 かえって妙な文章になっていますよw 私と swordone様が言いたいことは、 「n / 10 は、それ自体が int型である」 ということです。 ■ソースコード  public class Main {   public static void main(String[] args) {   int n = 9999;   System.out.println(n / 10);   }  } ■実行結果  999 > 変数ketaは整数(インテジャー)しか記憶しないように決められ ているから、代入の際に小数部が切り捨てられる 【というわけではありません】。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問