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

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

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

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

Q&A

解決済

4回答

988閲覧

【paiza】2進数の全加算器問題での問題解釈について

RaiseSkill

総合スコア50

Java

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

0グッド

0クリップ

投稿2022/07/20 07:04

前提

いつもお世話になります。
現在paizaにて、2進数の全加算器の問題を行っておりますが、問題解釈に悩まされております。

あくまでSNSシェア機能と共有用URLが掲示されているため、外部での質問が可能なものと解釈しての質問です。

該当ページは下記の通りです。
全加算器 (paizaランク C 相当)

以下の点で解釈に困る点がありますので、知恵をお貸し頂ければと思います。
・入力値 A B C1とあり、Aが1の場合は二進数「11」、Bが0の場合は二進数「00」などという解釈でいいのか?(例にある筆算の数値とは明らかな差異)
・入力値A Bは計算の途中で値の更新がなされ、繰り上がりの場合には、AかBのどちらかにC1の加算がなされるのか?

実現したいこと

AとBは、「2の0乗の位」と「2の1乗の位」で値の更新をすべきなのかどうかの判断と参考となるご意見を頂きたいです。

加えて、下記エラーコードが表示され、何度確認しても違いが見つからないのですが、どこが問題なのかご指摘頂けると幸いです。

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

試したこと

Java

1import java.util.*; 2import java.stream.Stream; 3 4public class Main { 5 public static void main(String[] args) { 6 // 自分の得意な言語で 7 // Let's チャレンジ!! 8 Scanner sc = new Scanner(System.in); 9 String[] line = sc.nextLine().split(" "); 10 int[] input = Stream.of(line).mapToInt(Integer::parseInt).toArray(); 11 12 int A = input[0]; int B = input[1]; int C1 = input[2]; 13 int C2 = 0; int S = 0; 14 15 16 if (A == 1 && B == 1) { 17 C2 = 1; S = 0; // C1 18 //if () { 19 System.out.println(C2 + " " + S); 20 //} 21 } else if (A == 1 ^ B == 1) { 22 C2 = 0; S = 1; // C1 23 System.out.println(C2 + " " + S); 24 } else { 25 C2 = 0; S = 0; // C1 26 System.out.println(C2 + " " + S); 27 } 28 29 30 31 } 32}

ここに問題に対して試したことを記載してください。

発生している問題・エラーメッセージ

全く本来の質問の趣旨とは異なりますが、以下のようなエラーコードが出ますが、何度確認してもエラーが分かりません。

Main.java:2: error: package java.stream does not exist import java.stream.Stream; ^ Main.java:10: error: cannot find symbol int[] input = Stream.of(line).mapToInt(Integer::parseInt).toArray(); ^ symbol: variable Stream location: class Main 2 errors

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

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

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

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

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

guest

回答4

0

ベストアンサー

この問題は、おそらくもっと単純で、

2数の下から2桁目(A,B)、および1桁目からの繰り上がり(C1)が与えられるので、
3桁目に繰り上がる数(C2)と2桁目の結果(S)を出力しろ

ということだと思われます。
また、streamはjava.util.streamパッケージに属します。import宣言の間違いです。

投稿2022/07/20 07:21

swordone

総合スコア20651

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

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

RaiseSkill

2022/07/20 13:37

@swordone様 なるほど! そんなシンプルな解釈でいいのですね!ありがとうございます。 早速、自分なりに問題を解いてみたいと思います!
RaiseSkill

2022/07/20 13:39

追伸: 宣言の訂正まで頂き、重ねてありがとうございます! 非常に助かります!
guest

0

swordone さんの回答通り、問題の太字部分だけを作れば良いのだと思います。そしてその為に変数をどうするかは…指定がありませんのでどうでも良いのでしょう。
言ってしまえば「入力の3つの2進数(1桁)を足して2進数2桁で出力(隙間あり)」さえ満たせば良いものと思います。

全加算器の図まで出ているので、それを元に書いてみるのも一興かと。

java

1public class Main { 2 public static void main(String[] args) { 3 int[][] datas = { 4 {0,0,0}, {0,1,0}, {1,0,0}, {1,1,0}, {0,0,1}, {0,1,1}, {1,0,1}, {1,1,1} 5 }; 6 for(int[] v : datas) { 7 System.out.println("a="+v[0]+" b="+v[1]+" c="+v[2]+" > " + FullAdder.exec(v[0],v[1],v[2])); 8 } 9 } 10} 11 12class Result { 13 final int c, s; //Carry, Sum 14 Result(int c, int s) { this.c = c; this.s = s; } 15 @Override 16 public String toString() { return "c=" + c + " s=" + s; } 17} 18//半加算器 19class HalfAdder { 20 static Result exec(int a, int b) { 21 int c = a & b; 22 int s = a ^ b; 23 return new Result(c, s); 24 } 25} 26//全加算器 27class FullAdder { 28 static Result exec(int a, int b, int c1) { 29 Result r1 = HalfAdder.exec(a, b); 30 int cx = r1.c; 31 int sy = r1.s; 32 Result r2 = HalfAdder.exec(sy, c1); 33 int cy = r2.c; 34 int c2 = cx | cy; 35 int s = r2.s; 36 return new Result(c2, s); 37 } 38}

実行結果

plain

1a=0 b=0 c=0 > c=0 s=0 2a=0 b=1 c=0 > c=0 s=1 3a=1 b=0 c=0 > c=0 s=1 4a=1 b=1 c=0 > c=1 s=0 5a=0 b=0 c=1 > c=0 s=1 6a=0 b=1 c=1 > c=1 s=0 7a=1 b=0 c=1 > c=1 s=0 8a=1 b=1 c=1 > c=1 s=1

投稿2022/07/20 10:48

編集2022/07/20 13:57
jimbe

総合スコア12659

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

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

RaiseSkill

2022/07/20 13:54

@jimbe様 詳細なご回答を頂き、誠にありがとうございます! A,B,C1の全パターンを2次元配列に格納するパターンがあるのですね。 参考になります。 メソッドの一行書きとか、すっきりしていて、なかなかオシャレですね。 ぜひ今後使わせて頂きます!
jimbe

2022/07/20 14:33

加算器を模さずに手っ取り早くだと String line = "0 1 1"; //入力 int s = Integer.bitCount(Integer.parseInt(line.replace(" ",""), 2)); //"1" をカウント System.out.println((s>>1&1)+" "+(s&1)); //出力 な感じですかね…
RaiseSkill

2022/07/24 08:20

@jimbe様 返信が遅くなり申し訳ありません。 こんなシンプルな書き方があるんですね! ぜひ、今後の参考にさせて頂きたいと思います。 ありがとうございます。
guest

0

swordone様、jimbe様より頂きました「A、Bの解釈」「エラー文の詳細」について合点がいきました!
ありがとうございます。

またdodox86様、フォロー頂きありがとうございました。
自分なりに再度調べてみたいと思います。

投稿2022/07/20 13:58

RaiseSkill

総合スコア50

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

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

0

全加算器、と言うのは一般的な用語となっていますんで、それで調べてみると解説が出てくると思います

投稿2022/07/20 07:38

y_waiwai

総合スコア87782

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

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

dodox86

2022/07/20 07:47

質問内容として「全加算器とはどういうものか」を問うているのではなく、入力値、出力値を含む問題の解釈について聞いているのだと思います。 (問題自体に「全加算器」、「半加算器」の単語は出てきているけど、そんな大げさに捉えなくても解ける)
y_waiwai

2022/07/20 08:21

まあ、全加算器というものがどういうものかわかれば、理解の足しにもなるでしょう、というものです。 私達にとってのあたりまえな常識、であっても、それを知らないってことならハードルは一つ増えますからね
dodox86

2022/07/20 08:35

> 全加算器というものがどういうものかわかれば、理解の足しにもなるでしょう、というものです。 それは本回答を読んだ時から一理あると思いましたのでコメントに留めました。(現時点での低評価は私ではありません)
RaiseSkill

2022/07/20 13:41

@dodox86様 早速のフォローありがとうございます! おっしゃる通りで、問題の解釈をお聞きしたかった次第です。
RaiseSkill

2022/07/20 13:41

@y_waiwai様 「全加算器」について、知見が足りませんでした。 早速、調べさせて頂きたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問