ホワイト数の数字を確認するためのJavaブール - アルゴリズム -- java フィールド と algorithm フィールド と recursion フィールド と boolean フィールド と digits フィールド 関連 問題

Java boolean-algorithm to check wheter number of digits is even












5
vote

問題

日本語

2進数として表示されるnの桁数が奇数であれば、trueを返す再帰的なメソッドを書き込もうとしています。 ブール値を返す場合は、再帰的メソッドでカウントできる方法は実際にはありません。

この解決策の一部は、2の電力であるかどうかを確認するためのものであると思います:

<事前> <コード> static boolean isPowers2(long n) { if (n % 2 != 0) return false; if (n / 2 == 1) return true; return isPowers2(n / 2); }

指数が奇数の場合、数字の数が偶数の場合、数字の数は均等であればめったにありません。しかし、私はBoolean関数で値を渡すことはできません。右?

返品するべきものの例:

<事前> <コード> // evenCount(0B0 ) is false // evenCount(0B1 ) is false // evenCount(0B10 ) is true // evenCount(0B11 ) is true // evenCount(0B100 ) is false // evenCount(0B111 ) is false // evenCount(0B1000 ) is true // evenCount(0B1010 ) is true // evenCount(0B10000) is false // evenCount(0B10110) istfalse

これは私が大学のアルゴリズムテストで失敗した質問であり、それでも解決する方法を把握することはできません。私は誰かがこの1つを解決する方法について私にヒントを与えることを願っています...

英語

I´m trying to write a recursive method that returns true, if the count of digits of n displayed as a binary number is even and false if it is odd. I don´t really get how I can count in a recursive method, if it returns a boolean.

I think part of the solution is, to check whether the number is a powers of 2:

static boolean isPowers2(long n) {     if (n % 2 != 0) return false;     if (n / 2 == 1) return true;     return isPowers2(n / 2); } 

If the exponent is odd then the count of digits is even, if it is even then the count of digits is uneven. But I can not pass a value with my boolean function, right?

Some examples for what should be returned:

  // evenCount(0B0    ) is false   // evenCount(0B1    ) is false   // evenCount(0B10   ) is true   // evenCount(0B11   ) is true   // evenCount(0B100  ) is false   // evenCount(0B111  ) is false   // evenCount(0B1000 ) is true   // evenCount(0B1010 ) is true   // evenCount(0B10000) is false   // evenCount(0B10110) istfalse 

This is a question I failed on an algorithms test in university and I still can´t figure out how to solve it. I hope someone can give me a hint on how to solve this one...

</div
              
   
   

回答リスト

6
 
vote
vote
ベストアンサー
 

入力が2の電力なのか確認は無関係です。各呼び出しで1ビットを削除する再帰的メソッドを作成する必要があります。

それが1ビットを削除した場合にのみ奇数の長さがある場合、数値は2進数を持ちます。

<事前> <コード> static boolean hasEvenLength(int n) { if (n<2) { // single digit return false; } return !hasEvenLength(n/2); }

これは負の負の入力を処理します。負の数の場合、私は常に真のビット(符号ビット)が常に設定されているので、常にtrueを返すべきであると主張することができますので、数字に32個の2進数字があります。

0から99の間のすべての数のメソッドの出力です。 <事前> <コード> 0 0 false 1 1 false 2 10 true 3 11 true 4 100 false 5 101 false 6 110 false 7 111 false 8 1000 true 9 1001 true 10 1010 true 11 1011 true 12 1100 true 13 1101 true 14 1110 true 15 1111 true 16 10000 false 17 10001 false 18 10010 false 19 10011 false 20 10100 false 21 10101 false 22 10110 false 23 10111 false 24 11000 false 25 11001 false 26 11010 false 27 11011 false 28 11100 false 29 11101 false 30 11110 false 31 11111 false 32 100000 true 33 100001 true 34 100010 true 35 100011 true 36 100100 true 37 100101 true 38 100110 true 39 100111 true 40 101000 true 41 101001 true 42 101010 true 43 101011 true 44 101100 true 45 101101 true 46 101110 true 47 101111 true 48 110000 true 49 110001 true 50 110010 true 51 110011 true 52 110100 true 53 110101 true 54 110110 true 55 110111 true 56 111000 true 57 111001 true 58 111010 true 59 111011 true 60 111100 true 61 111101 true 62 111110 true 63 111111 true 64 1000000 false 65 1000001 false 66 1000010 false 67 1000011 false 68 1000100 false 69 1000101 false 70 1000110 false 71 1000111 false 72 1001000 false 73 1001001 false 74 1001010 false 75 1001011 false 76 1001100 false 77 1001101 false 78 1001110 false 79 1001111 false 80 1010000 false 81 1010001 false 82 1010010 false 83 1010011 false 84 1010100 false 85 1010101 false 86 1010110 false 87 1010111 false 88 1011000 false 89 1011001 false 90 1011010 false 91 1011011 false 92 1011100 false 93 1011101 false 94 1011110 false 95 1011111 false 96 1100000 false 97 1100001 false 98 1100010 false 99 1100011 false

 

Checking if the input is a power of 2 is irrelevant. You should write a recursive method that removes one bit in each call.

A number has an even binary length if an only if it has an odd length if you remove one bit from it.

static boolean hasEvenLength(int n) {     if (n<2) { // single digit         return false;     }     return !hasEvenLength(n/2); } 

This handles non-negative input. For negative numbers I can argue that you should always return true, since the most significant bit (the sign bit) is always set, so you can say the number has 32 binary digits.

Here's the output of the method for all numbers between 0 and 99:

0 0 false 1 1 false 2 10 true 3 11 true 4 100 false 5 101 false 6 110 false 7 111 false 8 1000 true 9 1001 true 10 1010 true 11 1011 true 12 1100 true 13 1101 true 14 1110 true 15 1111 true 16 10000 false 17 10001 false 18 10010 false 19 10011 false 20 10100 false 21 10101 false 22 10110 false 23 10111 false 24 11000 false 25 11001 false 26 11010 false 27 11011 false 28 11100 false 29 11101 false 30 11110 false 31 11111 false 32 100000 true 33 100001 true 34 100010 true 35 100011 true 36 100100 true 37 100101 true 38 100110 true 39 100111 true 40 101000 true 41 101001 true 42 101010 true 43 101011 true 44 101100 true 45 101101 true 46 101110 true 47 101111 true 48 110000 true 49 110001 true 50 110010 true 51 110011 true 52 110100 true 53 110101 true 54 110110 true 55 110111 true 56 111000 true 57 111001 true 58 111010 true 59 111011 true 60 111100 true 61 111101 true 62 111110 true 63 111111 true 64 1000000 false 65 1000001 false 66 1000010 false 67 1000011 false 68 1000100 false 69 1000101 false 70 1000110 false 71 1000111 false 72 1001000 false 73 1001001 false 74 1001010 false 75 1001011 false 76 1001100 false 77 1001101 false 78 1001110 false 79 1001111 false 80 1010000 false 81 1010001 false 82 1010010 false 83 1010011 false 84 1010100 false 85 1010101 false 86 1010110 false 87 1010111 false 88 1011000 false 89 1011001 false 90 1011010 false 91 1011011 false 92 1011100 false 93 1011101 false 94 1011110 false 95 1011111 false 96 1100000 false 97 1100001 false 98 1100010 false 99 1100011 false 
</div
 
 
       
       
1
 
vote

数字を数える必要はありません、あなたはその数が奇数か偶数か偶数のどちらであるかを追跡する必要があるだけです。

<事前> <コード> boolean hasEvenDigitCount(long n) { if (n/2 == 0) { // handles both 1 and 0 as an even number of digits return false; } return !hasEvenDigitCount(n/2); }
 

You don't need to count the digits, you just need to keep track of whether that count is odd or even.

boolean hasEvenDigitCount(long n) {     if (n/2 == 0) { // handles both 1 and 0 as an even number of digits         return false;     }     return !hasEvenDigitCount(n/2); } 
</div
 
 
0
 
vote

NelfaleとEranによる解決策は大丈夫ですが、中間結果を追加のパラメータとして携帯する再帰的な問題を解決しながら、一般的な方法について言及しています。

<事前> <コード> def isEvenLength (n: Long) : Boolean = { def isEvenLength (n: Long, sofar: Boolean) : Boolean = { if (n < 2) sofar else isEvenLength (n/2, !sofar) } isEvenLength (n, false) }

私は内部関数がまだJavaに達したとは思わないので、疑似Javaでは、それはこのように見えるでしょう:

<事前> <コード> static boolean isEvenLength (final long n, final boolean sofar) { if (n < 2) sofar else isEvenLength (n/2, !sofar); } static boolean isEvenLength (final long n) { isEvenLength (n, false); }

だから長さをカウントすることは常に1つのSOFAR

を追加することによって行うことができます <事前> <コード> if (n < 2) sofar else isEvenLength (n/2, sofar+1)

(うまくいけば)SOFARのタイプとしてintを使って。

 

While the solutions by Nelfeal and Eran are fine, I like to mention a general way, while solving recursive problems, which is to carry the intermediate result as an additional parameter.

 def isEvenLength (n: Long) : Boolean = {       def isEvenLength (n: Long, sofar: Boolean) : Boolean = {          if (n < 2) sofar else isEvenLength (n/2, !sofar)       }        isEvenLength (n, false)   } 

I don't think that inner functions have reached Java yet, so in Pseudo-Java, it would look more like this:

 static boolean isEvenLength (final long n, final boolean sofar) {      if (n < 2) sofar else isEvenLength (n/2, !sofar);  }    static boolean isEvenLength (final long n) {      isEvenLength (n, false);  } 

So counting the length could be done by adding always one to sofar

 if (n < 2) sofar else isEvenLength (n/2, sofar+1) 

With (hopefully) int as type for sofar.

</div
 
 
0
 
vote

ハッカーのトリックとしてこれを使用することができます(Speedによって効果的ではない):

<事前> <コード> static boolean hasEvenLength(int n) { return Long.toBinaryString(n).length() % 2 == 0; }
 

As a hacker trick you can use this in java (not effective by speed):

static boolean hasEvenLength(int n) {     return Long.toBinaryString(n).length() % 2 == 0; } 
</div
 
 

関連する質問

1  コードゴルフ:ASCIIアート番号[重複]  ( Code golf ascii art number ) 
この質問はすでにここで回答を持っています 閉じた 10年前> 可能な重複: コードゴルフ - バナー生成 数値をASCIIアート桁に変換するために最短コードを投稿します。 入力 - z という整数変数が既に数字を含む整...

-3  数字の数字の合計  ( Digit square sum ) 
Phan Phanは、DigitsQuaresum()を複数回実行することで、2つの数字が元の数に戻ります。 •1 - &gt; 1 •89 - &gt。 145 - &gt; 42 - &gt; 20 - &gt; 4 - &gt; 16 ...

0  Javaの指定された数nで固有の数字を数える  ( To count unique digits in a given number n in java ) 
数n、例えば、1091を取ると、ここでは数字の数は4ですが、固有の数字の数は3、0&AMPです。 9はユニークです(1が繰り返されるので)。 私は個々の桁に数字を破壊し、それをArrayListに追加し、後でそれを配列に変換しようとしました。次に、アレイを繰り...

9  Kable各列に異なる数字数を表示します  ( Kable displays different number of digits in each column ) 
編集時にワードの機能性を知ってキーブルを使っています。私は最初の列としてカウントを持つ単純なテーブルを持つシンプルなテーブルを持つことがよくあり、それからプロポーションを持つ数列の数列です。カウントカラムを最も近い桁と他の列に最も近い桁に丸める必要があります。...

3  数字の数字を合計する最速の方法  ( Fastest way to sum digits in a number ) 
多数のものを考える。 9223372036854775807 (<コード> Int64.MaxValue )、数字を合計する最も早い方法は何ですか? 現在私は int :に各文字を転送して再配置しています。 <事前> <コード> num.ToString()...

147  整数の桁数を決定するための効率的な方法  ( Efficient way to determine number of digits in an integer ) 
非常に 効率的な C ++の整数に数桁の数字を決定する方法は何ですか? ...

-1  JSON文字列をマッピングするときにすべての桁を保持する方法  ( How to keep all digits when parsing a json string to map ) 
このようなJSON文字列を得ました <事前> <コード> { "ParValue":100.00, "RealAmount":100.00, "SettlementAmt":86.000, "CardNo":"1707264632031051", "Retur...

0  2桁の間に一致する数字が必要です  ( Need matching digits between two decimals ) 
私は2つの小数を持っていると言ってみましょう(フロート)。 <事前> <コード> path16 今度は、この10進数の一致桁に結果を必要とします。だからここでその結果はになるべきです 123.62。 if、 <事前> <コード> pathlib7 ...

3  与えられた数の数字を識別します。  ( Identify the digits in a given number ) 
プログラミングが新しい、そして私は問題に立ち往生しています。 4692 を入力する場合は、特定の数の別の数字を識別したいと思います。 4692 を入力して、<コード> 4 6 9 2 を識別してください。アレイを使用せずに、ええ。 ...

1311  Javaの小数点以下の場所に数字を丸める方法  ( How to round a number to n decimal places in java ) 
私が2倍にするのは、丸みを使ってラウンドする文字列に二重を変換する方法です。これはほとんどの場合、ほとんどの人々が期待する標準的な方法です。 私はまた、表示されるべき重要な数字のみを望みます - すなわち末尾のゼロがあるべきではありません。 私はこれを行う1つ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有