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

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

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

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

アルゴリズム

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

Q&A

解決済

1回答

2182閲覧

Java:繰り上がりのない足し算のアルゴリズムについて

kinako_make

総合スコア7

Java

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

アルゴリズム

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

0グッド

0クリップ

投稿2020/09/08 07:14

編集2020/09/08 07:51

初心者です。
入力された1~999の2つの整数を繰り上がりのない足し算をして、計算結果を出力するプログラムを作っています。
例)27+84 の場合
1>1の位の 7+4=11
2>10の位の 2+8=10
3>各計算結果の1の位を出力する 答え:01 ※先頭の計算結果が0の場合でも表示すること。

調べたりしながら、自分なりにコーディングしましたが長くなりました。
もう少し簡単にできそうといろいろ試しましたが、うまくいかず
いいやり方や省略できるところなどあると思います。

アドバイスを頂けると幸いです。
よろしくお願いいたします。

import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String num1 = sc.next(); //整数取得 String num2 = sc.next(); //整数取得 String num3 = ""; char[] cNum1 = num1.toCharArray(); //char型にキャストして1桁ずつの数字に分ける char[] cNum2 = num2.toCharArray(); //char配列数=数字の桁数 int len1 = cNum1.length; int len2 = cNum2.length; Integer sum1 = 0; Integer sum2 = 0; Integer sum3 = 0; //入力値が2桁と3桁の場合がある if(len1 == 2 && len2 == 2){ //[0]10の位、[1]1の位 sum1 = Character.getNumericValue(cNum1[1]) + Character.getNumericValue(cNum2[1]); //同じ桁数で計算 sum2 = Character.getNumericValue(cNum1[0]) + Character.getNumericValue(cNum2[0]); }else if(len1 == 3 && len2 == 3){ //[0]100の位、[1]10の位、[2]1の位 sum1 = Character.getNumericValue(cNum1[2]) + Character.getNumericValue(cNum2[2]); //同じ桁数で計算 sum2 = Character.getNumericValue(cNum1[1]) + Character.getNumericValue(cNum2[1]); sum3 = Character.getNumericValue(cNum1[0]) + Character.getNumericValue(cNum2[0]); num3 = sum3.toString(); }else if(len1 == 3 && len2 == 2){ sum1 = Character.getNumericValue(cNum1[2]) + Character.getNumericValue(cNum2[1]); //同じ桁数で計算 sum2 = Character.getNumericValue(cNum1[1]) + Character.getNumericValue(cNum2[0]); sum3 = Character.getNumericValue(cNum1[0]) ; num3 = sum3.toString(); }else if(len1 == 2 && len2 == 3){ sum1 = Character.getNumericValue(cNum2[2]) + Character.getNumericValue(cNum1[1]); //同じ桁数で計算 sum2 = Character.getNumericValue(cNum2[1]) + Character.getNumericValue(cNum1[0]); sum3 = Character.getNumericValue(cNum2[0]) ; num3 = sum3.toString(); } num1 = sum1.toString(); //String型にキャスト num2 = sum2.toString(); cNum1 = num1.toCharArray(); //char型にキャスト cNum2 = num2.toCharArray(); char[] cNum3 = num3.toCharArray(); //計算結果の1の位のみ表示 if(cNum3.length == 1){ //3桁の場合 System.out.print(cNum3[0]); }else if(cNum3.length != 0){ System.out.print(cNum3[1]); } if(cNum2.length == 1){ System.out.print(cNum2[0]); }else{ System.out.print(cNum2[1]); } if(cNum1.length == 1){ System.out.print(cNum1[0]); }else{ System.out.print(cNum1[1]); } } }

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

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

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

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

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

dodox86

2020/09/08 07:36

> 例)27+84 の場合 > 2>10の位の 2+28=10 10の位は 2+8=10 、ですね? (誤記?) また、コードはマークダウン記法を用いて読みやすくするようにしてください。そうでないとインデントも崩れ、読みづらくなります。 https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にしてソースコードを適切に表示するようにしましょう。
kinako_make

2020/09/08 07:52

例の式、コード修正しました。 アドバイスありがとうございました。
guest

回答1

0

ベストアンサー

momon-gaさんのコメントを元に、3桁制限と0+0の時に例外的に"0"を出す処理を追加。

Java

1int num1 = sc.nextInt(); 2int num2 = sc.nextInt(); 3 4String ret = ""; 5for(; (num1+num2)>0 && ret.length()<3; num1/=10,num2/=10){ 6 ret = (num1 % 10 + num2 % 10) % 10 + ret; 7} 8ret = ret.length()==0?"0":ret; 9 10System.out.print(ret);

以下はおまけ

Java

1int num1 = sc.nextInt(); 2int num2 = sc.nextInt(); 3int num3 = 0; 4int len = 0; 5 6for(int i=1; (num1+num2)>0; i*=10,num1/=10,num2/=10,len++){ 7 num3 += (num1 % 10 + num2 % 10) % 10 * i; 8} 9num3 %= 1000; 10len = len==0?1:len; 11len = len>3?3:len; 12 13System.out.printf("%0"+len+"d",num3);

とりあえず、こんなんで。結果はちゃんとあってるはず。
ミスがあったので修正。

下のだと、4桁以上にも対応(というより上の3桁制限を外しただけ)
どちらもちゃんと入力桁数に応じて頭の0もちゃんとつくはずです。
(9+1→0、90+10→00、998+100→098)

Java

1int num1 = sc.nextInt(); 2int num2 = sc.nextInt(); 3int num3 = 0; 4int len = 0; 5 6for(int i=1; (num1+num2)>0; i*=10,num1/=10,num2/=10,len++){ 7 num3 += (num1 % 10 + num2 % 10) % 10 * i; 8} 9len = len==0?1:len; 10 11System.out.printf("%0"+len+"d",num3);

投稿2020/09/08 10:03

編集2020/09/08 12:33
amiya

総合スコア1218

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

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

momon-ga

2020/09/08 11:37

lengthとらずに、普通に文字列連結でも良いと思います。 String ret = ""; for(; (num1+num2)>0;num1/=10,num2/=10){ ret = (num1 % 10 + num2 % 10) % 10 + ret; } System.out.print(ret);
amiya

2020/09/08 11:43

あ。確かに、それできちんと必要な桁数の0になりますね。 (3桁以上の入力を考慮するなら継続条件増やすだけで良いし)
kinako_make

2020/09/08 14:03

お二方とも、ありがとうございます! まさかこんなに短くすっきりするとは思わなかったので本当にびっくりしました。 なんとか値に代入して何をしているのかのトレースをして答えが出ることはわかりましたが 自分でこのようなアルゴリズムが考えられるとは思えません。(できるように目標にはします!!) そこでどんな風にアルゴリズムを考えればいいのか、勉強法などあれば教えていただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問