7

最近、ユーザーが入力した数字の桁数をチェックする必要があるプログラムを作成していました。その結果、次のコードを作成しました。

int x;    
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
  count++;
  x = x/10;
}

私が言えることは(私の限られた経験でも)、それは粗雑で、むしろエレガントではないように見えるということです.

このコードを改善する方法についてアイデアを持っている人はいますか (組み込みの c++ 関数を使用していない場合)。

4

7 に答える 7

12

特定の例では、数値を文字列として読み取り、文字数を数えることができます。

しかし、一般的なケースでは、自分のやり方で行うことも、10 を底とする対数を使用することもできます。

対数の例を次に示します。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    double n;
    cout << "Enter a number: ";
    cin >> n;

    cout << "Log 10 is " << log10(n) << endl;
    cout << "Digits are " << ceil(log10(fabs(n)+1)) << endl;
    return 0;
}
于 2011-07-06T19:08:41.147 に答える
5
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;
于 2011-07-06T19:14:18.960 に答える
2

ユーザー入力を文字列として読み取ってから、文字数を数えることはできますか? (消毒・トリミング後など)

または、ライブラリに面倒な作業を任せることもできます。値を文字列に変換してから、文字数を数えます。

cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();
于 2011-07-06T19:08:30.890 に答える
1

xが整数であり、「組み込み関数」によって対数を除外していない場合は、次のことができます。

double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);
于 2011-07-06T19:14:11.313 に答える
1

条件付きの移動を伴う非常にパイプライン化された CPU を考えると、この例はより高速になる可能性があります。

if (x > 100000000) { x /= 100000000; count += 8; }
if (x > 10000) { x /= 10000; count += 4; }
if (x > 100) { x /= 100; count += 2; }
if (x > 10) { x /= 10; count += 1; }

完全に広げた状態です。ただし、優れたコンパイラは、while ループを最大 10 回の反復まで展開することもできます。

于 2011-07-06T20:14:34.590 に答える
0
#include<iostream>
using namespace std;
int main()
{
int count=0;
    double x;
    cout << "Enter a number: ";
    cin >> x;
    x /= 10;
    while(x > 1)
    {
      count++;
      x = x/10;
    }
    cout<<count+1;
}
于 2013-10-09T14:01:59.920 に答える
-1

数値を文字列として読み取るという提案を除いて、有効な小数桁数をカウントする現在の方法は問題ありません。短くすることもできますが、これはおそらく明確ではない可能性があります(gccが警告を発行しないようにするために追加の括弧のセットが追加されています)。

while((x = x/10))
  count++;
于 2011-07-06T19:13:32.333 に答える