文字列を使用しないで整数から末尾のゼロを高速に削除するにはどうすればよいですか?整数型から右のゼロをトリムする
たとえば、1000
は1
になり、6789000
は6789
になる必要があります。
簡単な解決策を繰り返し、...、10^max_exponent
による除算の剰余を取っ10000
、1000
、100
、10
(あるいは逆の順序で)などと0
にそれを比較しています。
誰かがそれをより速く行うことができますか?
文字列を使用しないで整数から末尾のゼロを高速に削除するにはどうすればよいですか?整数型から右のゼロをトリムする
たとえば、1000
は1
になり、6789000
は6789
になる必要があります。
簡単な解決策を繰り返し、...、10^max_exponent
による除算の剰余を取っ10000
、1000
、100
、10
(あるいは逆の順序で)などと0
にそれを比較しています。
誰かがそれをより速く行うことができますか?
本質的に、これは10の力によって、バイナリ検索です:
if N mod 100000000 = 0
N = N div 100000000;
if N mod 10000 = 0
N = N div 10000;
if N mod 10000 = 0
N = N div 10000;
if N mod 100 = 0
N = N div 100;
if N mod 10 = 0
N = N div 10;
あなたは数のをLog10を取る場合は、それが持っているどのように多くの桁数を把握することができます。この情報を使用すると、あなたの番号よりもずっと大きい10の最小パワーで分割プロセスを開始することができます。その後、いくつかのMODテストと部門を排除できます。あなたはコードを単純化するためのループを作ることができます。
擬似コード:除去末尾のゼロとのそれらの値に
digit_count = log10(num) + 1
pow = 10^digit_count
for (int i = 0; i < digit_count; i++) {
if (num mod pow == 0) {
num /= pow
}
pow /= 10
}
return num
テーブル・マッピングをプレするすべての数字。テーブル1001 => 1001、テーブル1010 => 101、テーブル6789000 => 6789、テーブル6789001 => 6789001というように、 。任意の数Nの場合は、N番目のエントリをテーブルから戻します。とても早い。 – HostileFork
@HostileFork max_numberのタイプがint64_tの場合、つまり〜9 * 10^18? :) – vladon
@vladon - 公正であるために、彼のやり方は速く、これはあなたが求めていたものです。 – Sean