2016-04-15 12 views
1

文字列を使用しないで整数から末尾のゼロを高速に削除するにはどうすればよいですか?整数型から右のゼロをトリムする

たとえば、10001になり、67890006789になる必要があります。

簡単な解決策を繰り返し、...、10^max_exponentによる除算の剰余を取っ10000100010010(あるいは逆の順序で)などと0にそれを比較しています。

誰かがそれをより速く行うことができますか?

+2

テーブル・マッピングをプレするすべての数字。テーブル1001 => 1001、テーブル1010 => 101、テーブル6789000 => 6789、テーブル6789001 => 6789001というように、 。任意の数Nの場合は、N番目のエントリをテーブルから戻します。とても早い。 – HostileFork

+0

@HostileFork max_numberのタイプがint64_tの場合、つまり〜9 * 10^18? :) – vladon

+1

@vladon - 公正であるために、彼のやり方は速く、これはあなたが求めていたものです。 – Sean

答えて

3

本質的に、これは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; 
+3

このソリューションは問題のソリューションと同じではないのですが、OPが改善したいソリューションですか? –

+1

@גלעדברקן彼はすべての10の力を19の操作で使いますが、Log2(19)= 5の操作を行うには十分です – MBo

+0

「第2のN mod 10000」は冗長ではありませんか? – erickson

0

あなたは数のを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 
関連する問題