質問

書コードを数が3で割り切れ.入力の機能が シングル ビットは0又は1の出力は1の数を受けたこれまでは、バイナリ表現の数が3で割り切ればゼロになります。

例:

input  "0":       (0)  output 1
inputs "1,0,0":   (4)  output 0
inputs "1,1,0,0": (6)  output 1

これは面接の質問です。私ための描画論理ゲートのことですのでstackoverflow私は受け付け符号化言語です。ボーナスポイントのためのハードウェア実施(verilogます。

Part a(簡易): 最初の入力のMSB.

パートb(も): 最初の入力はLSB.

パートc(難しいわけではないですが): での高速化と小型化、(a)又は(b)?(理論的にはBig-Oの意味でも実質的に高速化/小さくなります。) 現在の遅/大型のものとしfast/小型の高速-小型です。

役に立ちましたか?

解決

状態表LSB:

S I S' O
0 0 0  1
0 1 1  0
1 0 2  0
1 1 0  1
2 0 1  0
2 1 2  0

説明:0で割れる。 0 << 1 + 0 = 0.繰り返し利用 S = (S << 1 + I) % 3O = 1 の場合 S == 0.

状態表MSB:

S I S' O
0 0 0  1
0 1 2  0
1 0 1  0
1 1 0  1
2 0 2  0
2 1 1  0

説明:0で割れる。 0 >> 1 + 0 = 0.繰り返し利用 S = (S >> 1 + I) % 3O = 1 の場合 S == 0.

S' は上記とは異なるものがあり、Oの作品と同じで S' 0の場合(00、11。以降、Oは同じなのですが、O_LSB=O_MSBいるMSBてLSB、またはその逆に、利用の短います。

他のヒント

がかなりよく知られるかを決定するかどうかは複数の11日を交互に行うようにすることは、奇数を足したり引いたりしたその小数桁を表します。ばすのは複数の11、その番号で始まったもの11:

47278    4 - 7 + 2 - 7 + 8 = 0, multiple of 11     (47278 = 11 * 4298)
52214    5 - 2 + 2 - 1 + 4 = 8, not multiple of 11 (52214 = 11 * 4746 + 8)

申し込みができ、同じフレキシビリティをバイナリー。バイナリの数は3である場合にだけ、交互にお客様の送料のご負担を軽減のビットが複数の3:

4   = 100       1 - 0 + 0 = 1, not multiple of 3
6   = 110       1 - 1 + 0 = 0, multiple of 3
78  = 1001110   1 - 0 + 0 - 1 + 1 - 1 + 0 = 0, multiple of 3
109 = 1101101   1 - 1 + 0 - 1 + 1 - 0 + 1 = 1, not multiple of 3

では差がなかのMSBまたはLSB、以下のPython関数の作品にもました。そのうる反復子を返しますビットです。 multiplier 交互に1と2の代わりに1-1めのモデューロ製の番号です。

def divisibleBy3(iterator):

    multiplier = 1
    accumulator = 0

    for bit in iterator:
        accumulator = (accumulator + bit * multiplier) % 3
        multiplier = 3 - multiplier

    return accumulator == 0

こちら---新しいもの...確認方法の場合、バイナリー数を任意の長さのもの何千人もの桁数が3で割り切れ.

divisible-by-3 state machine

-->((0))<---1--->()<---0--->(1)        ASCII representation of graph

からの画像になります。

  1. きのダブル。
  2. さつまたはゼロの場合、桁内部の円を、そしてご宿泊いただくことです。しかし場合には桁には、ご旅行に。
  3. 繰り返し二つのステップまですべての桁がcomsumed.
  4. またはダブル円のバイナリー数が3で割り切れ.

することもできます生成の数で割り切れる3.とかイメージすることは難しいだろうへ転換する回路です。

1例のグラフ...

11000000000001011111111111101が3で割り切れ(という結果で終えられるようにダブル円)

やってみます。

することができま類似の技を行うMOD10日時に変換するバイナリを拠10ます。(10円毎に倍増枠部分を拡大するとともにの価値0-9によるmodulo)

編集: こちらは桁走左れている方まで楽しめる修正の有限状態機械の逆の言語のものです。

注意: アスキーの表現のグラフ()は単一円(())を示した"ダブルです。有限状態機械と呼ばれる状態で、ダブルクのように受け入れ状態の状態が、最終的に3で割り切れ)

ここでは簡単について教えてください。年1=22 mod3まで1=22n mod3毎に正の整数です。さらに2=22n+1 mod3.そのため一定の場合整数が3で割り切れによる計数の1ビットまでの奇数ビットの位置を掛けると、この番号2、追加の1ビットでもビットposistionsとして追加しようとすると、結果を確認した場合の結果で割れる3.

例:5710=1110012.2ビットまでの奇数位置に、2つのビットでも位置があります。2*2 + 2 =6で割れる3.そのため57で割れる3.

ここでも思い解決へ向けての質問c)場合に反転のビットの整数バイナリのすべてのビットはも/奇数の位置またはすべてのビットが変化します。そのため反転反転時にはビットの整数nの結果は整数が3で割り切れの場合にだけ、nが3で割り切れ.そのため会社の動きをタイムリーのための質問を作成しなく変更答b)を開きます。うーん、そこをもたらすことが予想されるアプローチで高速...

必要な全ての計算を算modulo3.ぐことができるというの

MSB:

number=0
while(!eof)
    n=input()
    number=(number *2 + n) mod 3

if(number == 0)
    print divisible

LSB:

number = 0;
multiplier = 1;
while(!eof)
    n=input()
    number = (number + multiplier * n) mod 3
    multiplier = (multiplier * 2) mod 3

if(number == 0)
   print divisible

これは一般の考え...

現在、お部を理解し なぜ これは正しい。

あり、宿題を自分自身;)

あまり出現しないと考える番成長できる任意に長く、使用できません mod 3 ここで、以降のご人数に成長して能力を超えたの整数クラスです。

その考え方としては、通知はどうな多くの注目を集めています。だが追加右端が何bit目にくるか、どん実際に行っていることはまず左屋への注文数がカットを新たに加える。

Shift-左と同じ値を乗じ2を新たに加えるビットのいずれかの追加0または1です。として0、うすることで再帰的にはmodulo-3の最後の番号です。

last | input || next | example
------------------------------------
0    | 0     || 0    | 0 * 2 + 0 = 0
0    | 1     || 1    | 0 * 2 + 1 = 1
1    | 0     || 2    | 1 * 2 + 0 = 2
1    | 1     || 0    | 1 * 2 + 1 = 0 (= 3 mod 3)
2    | 0     || 1    | 2 * 2 + 0 = 1 (= 4 mod 3)
2    | 1     || 2    | 2 * 2 + 1 = 2 (= 5 mod 3)

現在を見てみましょうたさんまがタイアップムービーすべてにおいて理由があります。まず、通知する:

22n mod3=1

22n+1 mod3=2

そして今、どちらかの追加1または2のmodに基づく場合、現在の繰り返し処理が奇数のもの.

last | n is even? | input || next | example
-------------------------------------------
d/c  | don't care | 0     || last | last + 0*2^n = last
0    | yes        | 1     || 0    | 0 + 1*2^n = 1 (= 2^n mod 3)
0    | no         | 1     || 0    | 0 + 1*2^n = 2 (= 2^n mod 3)
1    | yes        | 1     || 0    | 1 + 1*2^n = 2
1    | no         | 1     || 0    | 1 + 1*2^n = 0 (= 3 mod 3)
1    | yes        | 1     || 0    | 2 + 1*2^n = 0
1    | no         | 1     || 0    | 2 + 1*2^n = 1
input  "0":       (0)  output 1
inputs "1,0,0":   (4)  output 0
inputs "1,1,0,0": (6)  output 1

なこの最後に入力する 12, やって誤解を問われているのか

実際の印刷方法を実際に作ります。C:

MSB方法

/* 
Returns 1 if divisble by 3, otherwise 0
Note: It is assumed 'input' format is valid
*/
int is_divisible_by_3_msb(char *input) {
  unsigned value = 0;
  char *p = input;
  if (*p == '1') {
    value &= 1;
  }
  p++;
  while (*p) {
    if (*p != ',') {
      value <<= 1;
      if (*p == '1') {
        ret &= 1;
      }
    }
    p++;
  }
  return (value % 3 == 0) ? 1 : 0;
}

LSB方法

/* 
Returns 1 if divisble by 3, otherwise 0
Note: It is assumed 'input' format is valid
*/
int is_divisible_by_3_lsb(char *input) {
  unsigned value = 0;
  unsigned mask = 1;
  char *p = input;
  while (*p) {
    if (*p != ',') {
      if (*p == '1') {
        value &= mask;
      }
      mask <<= 1;
    }
    p++;
  }
  return (value % 3 == 0) ? 1 : 0;
}

個人的にしていくと考えられます大きく異なるのです。

と思いNathan Fellmanが、一a、bを除く億ニーズの追加作品の状態:を続けるために必要なトラックの場合は桁位置が奇数のもの).

I 考え フレキシビリティのためのパートCには自身の last 値はステップと呼びます。I.。0が0 1が2-2が1になります。

数が3で割り切れれば、和の桁数が3で割り切れ.

追加が可能なの桁の和:

  • の合計額以上の10の方法
  • の場合は3,6,9その分割可能
  • の合計額は3,6,9その後で割れない
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top