Cで整数の長さを見つける方法を知りたいのですが。
例えば:
- 1 => 1
- 25 => 2
- 12512 => 5
- 0 => 1
等々。
Cでこれを行うにはどうすればよいですか?
数値の絶対値の基数10の対数を取り、それを切り捨てて、1を足してみませんか?これは、0でない正の数と負の数に対して機能し、文字列変換関数を使用する必要がなくなります。
、、、log10
および関数はによって提供されabs
ます。例えば:floor
math.h
int nDigits = floor(log10(abs(the_integer))) + 1;
に従って返されるthe_integer != 0
ので、これを次のことを保証する句でラップする必要があります。log10(0)
-HUGE_VAL
man 3 log
さらに、入力が負の場合、負の符号を含む数値の長さに関心がある場合は、最終結果に1を追加することをお勧めします。
int nDigits = Math.floor(Math.log10(Math.abs(the_integer))) + 1;
注意:このメソッドに含まれる計算の浮動小数点の性質により、より直接的なアプローチよりも遅くなる可能性があります。効率の議論については、Kangkanの回答のコメントを参照してください。
高速で非常に単純な解決策に興味がある場合は、次の方法が最も速い場合があります(これは問題の数値の確率分布によって異なります)。
int lenHelper(unsigned x) {
if (x >= 1000000000) return 10;
if (x >= 100000000) return 9;
if (x >= 10000000) return 8;
if (x >= 1000000) return 7;
if (x >= 100000) return 6;
if (x >= 10000) return 5;
if (x >= 1000) return 4;
if (x >= 100) return 3;
if (x >= 10) return 2;
return 1;
}
int printLen(int x) {
return x < 0 ? lenHelper(-x) + 1 : lenHelper(x);
}
最も独創的なソリューションでは賞品を獲得できないかもしれませんが、理解するのは簡単で、実行するのも簡単です。そのため、高速です。
MSCを使用するQ6600で、次のループを使用してこれをベンチマークしました。
int res = 0;
for(int i = -2000000000; i < 2000000000; i += 200) res += printLen(i);
このソリューションには0.062秒かかり、スマート対数アプローチを使用したPete Kirkhamによる2番目に速いソリューションには0.115秒かかります。これは、ほぼ2倍の長さです。ただし、10000以下の数値の場合、スマートログの方が高速です。
ある程度の明確さを犠牲にして、より確実にスマートログを打ち負かすことができます(少なくともQ6600では):
int lenHelper(unsigned x) {
// this is either a fun exercise in optimization
// or it's extremely premature optimization.
if(x >= 100000) {
if(x >= 10000000) {
if(x >= 1000000000) return 10;
if(x >= 100000000) return 9;
return 8;
}
if(x >= 1000000) return 7;
return 6;
} else {
if(x >= 1000) {
if(x >= 10000) return 5;
return 4;
} else {
if(x >= 100) return 3;
if(x >= 10) return 2;
return 1;
}
}
}
このソリューションは、大きな数値では依然として0.062秒であり、小さな数値では約0.09秒に低下します。どちらの場合も、スマートログアプローチよりも高速です。(gccはより高速なコードを作成します。このソリューションでは0.052秒、スマートログアプローチでは0.09秒です)。
int get_int_len (int value){
int l=1;
while(value>9){ l++; value/=10; }
return l;
}
2つ目は、負の数でも機能します。
int get_int_len_with_negative_too (int value){
int l=!value;
while(value){ l++; value/=10; }
return l;
}
次のような関数を書くことができます:
unsigned numDigits(const unsigned n) {
if (n < 10) return 1;
return 1 + numDigits(n / 10);
}
nの長さ:
length = ( i==0 ) ? 1 : (int)log10(n)+1;
正しいsnprintf
実装:
int count = snprintf(NULL, 0, "%i", x);
整数の桁数x
はに等しくなり1 + log10(x)
ます。だからあなたはこれを行うことができます:
#include <math.h>
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
printf("x has %d digits\n", 1 + (int)log10(x));
}
または、ループを実行して自分で桁を数えることもできます。数値が0になるまで10で整数除算を行います。
int numDigits = 0;
do
{
++numDigits;
x = x / 10;
} while ( x );
1
整数が最初の解に含まれている場合は、少し注意して返す必要0
があります。また、負の整数を処理することもできます(-x
ifを使用x < 0
)。
最も効率的な方法は、整数に設定された最上位ビットを決定するために使用されるものと同様の、高速の対数ベースのアプローチを使用することです。
size_t printed_length ( int32_t x )
{
size_t count = x < 0 ? 2 : 1;
if ( x < 0 ) x = -x;
if ( x >= 100000000 ) {
count += 8;
x /= 100000000;
}
if ( x >= 10000 ) {
count += 4;
x /= 10000;
}
if ( x >= 100 ) {
count += 2;
x /= 100;
}
if ( x >= 10 )
++count;
return count;
}
この(おそらく時期尚早の)最適化には、私のネットブックでの2,000万回の呼び出しに0.65秒かかります。zed_0xffのような反復除算には1.6秒かかり、Kangkanのような再帰除算には1.8秒かかり、浮動小数点関数(Jordan Lewisのコード)の使用にはなんと6.6秒かかります。snprintfの使用には11.5秒かかりますが、整数だけでなく、任意の形式でsnprintfが必要とするサイズが得られます。ジョーダンは、タイミングの順序が彼のプロセッサで維持されていないことを報告しています。これは、私のプロセッサよりも高速に浮動小数点を実行します。
最も簡単なのは、おそらくsnprintfに印刷された長さを尋ねることです。
#include <stdio.h>
size_t printed_length ( int x )
{
return snprintf ( NULL, 0, "%d", x );
}
int main ()
{
int x[] = { 1, 25, 12512, 0, -15 };
for ( int i = 0; i < sizeof ( x ) / sizeof ( x[0] ); ++i )
printf ( "%d -> %d\n", x[i], printed_length ( x[i] ) );
return 0;
}
はい、sprintfを使用しています。
int num;
scanf("%d",&num);
char testing[100];
sprintf(testing,"%d",num);
int length = strlen(testing);
または、関数を使用して数学的にこれを行うこともできますlog10
。
int num;
scanf("%d",&num);
int length;
if (num == 0) {
length = 1;
} else {
length = log10(fabs(num)) + 1;
if (num < 0) length++;
}
int digits=1;
while (x>=10){
x/=10;
digits++;
}
return digits;
sprintf(s, "%d", n);
length_of_int = strlen(s);
あなたはこれを使うことができます-
(data_type)log10(variable_name)+1
元:
len =(int)log10(number)+1;
この問題では、私はいくつかの算術解を使用しました。ありがとう :)
int main(void)
{
int n, x = 10, i = 1;
scanf("%d", &n);
while(n / x > 0)
{
x*=10;
i++;
}
printf("the number contains %d digits\n", i);
return 0;
}
非常にシンプル
int main() {
int num = 123;
char buf[50];
// convert 123 to string [buf]
itoa(num, buf, 10);
// print our string
printf("%s\n", strlen (buf));
return 0;
}
ゼロになるまで10で除算し続けてから、除算数を出力します。
int intLen(int x)
{
if(!x) return 1;
int i;
for(i=0; x!=0; ++i)
{
x /= 10;
}
return i;
}
これはネガティブとポジティブの両方のインタイガーに当てはまります
int get_len(int n)
{
if(n == 0)
return 1;
if(n < 0)
{
n = n * (-1); // if negative
}
return log10(n) + 1;
}
同じロジックがforループになります
int get_len(int n)
{
if(n == 0)
return 1;
int len = 0;
if(n < 0)
n = n * (-1);
while(n > 1)
{
n /= 10;
len++;
}
return len;
}
整数を文字列にキャストして、次のような長さを取得してみませんか。
int data = 123;
int data_len = String(data).length();
簡単なプログラムの場合...
int num = 456, length=0 // or read value from the user to num
while(num>0){
num=num/10;
length++;
}
別の変数を使用して初期num
値を保持します。
私の意見では、最短で最も簡単な解決策は次のとおりです。
int length , n;
printf("Enter a number: ");
scanf("%d", &n);
length = 0;
while (n > 0) {
n = n / 10;
length++;
}
printf("Length of the number: %d", length);
私のやり方:
数が10で割り切れない限り、除算します。
u8 NumberOfDigits(u32 number)
{
u8 i = 1;
while (number /= 10) i++;
return i;
}
他の提案と比べてどれくらい速いかわかりません。
int intlen(int integer){
int a;
for(a = 1; integer /= 10; a++);
return a;
}
より詳細な方法は、この関数を使用することです。
int length(int n)
{
bool stop;
int nDigits = 0;
int dividend = 1;
do
{
stop = false;
if (n > dividend)
{
nDigits = nDigits + 1;
dividend = dividend * 10;
}
else {
stop = true;
}
}
while (stop == false);
return nDigits;
}
int returnIntLength(int value){
int counter = 0;
if(value < 0)
{
counter++;
value = -value;
}
else if(value == 0)
return 1;
while(value > 0){
value /= 10;
counter++;
}
return counter;
}
この方法は、このタスクに適していると思います。
価値と答え:
-50-> 3 //マイナスをカウントしたくない場合は、1文字としてカウントし、5行目からcounter++を削除します。
566666-> 6
0-> 1
505-> 3
整数の長さが変化する制限を使用します。小数の場合は10の累乗であるため、指定された整数が制限を超えていないことを確認するたびにカウンターを使用します。
math.h
依存関係がある場合:
#include <math.h>
int count_digits_of_integer(unsigned int integer) {
int count = 1;
while(1) {
int limit = pow(10, count);
if(integer < limit) break;
count++;
}
return count;
}
依存関係なし:
int int_pow(int base, int exponent) {
int potency = base;
for(int i = 1; i < exponent; i++) potency *= base;
return potency;
}
int count_digits_of_integer(unsigned int integer) {
int count = 1;
while(1) {
int limit = int_pow(10, count);
if(integer < limit) break;
count++;
}
return count;
}
#include <stdio.h>
// Copy and paste the solution code here
int main() {
printf("%i -> (%i digits)\n", 0, count_digits_of_integer(0));
printf("%i -> (%i digits)\n", 12, count_digits_of_integer(12));
printf("%i -> (%i digits)\n", 34569, count_digits_of_integer(34569));
printf("%i -> (%i digits)\n", 1234, count_digits_of_integer(1234));
printf("%i -> (%i digits)\n", 3980000, count_digits_of_integer(3980000));
printf("%i -> (%i digits)\n", 100, count_digits_of_integer(100));
printf("%i -> (%i digits)\n", 9, count_digits_of_integer(9));
printf("%i -> (%i digits)\n", 385784, count_digits_of_integer(385784));
return 0;
}
出力:
0 -> (1 digits)
12 -> (2 digits)
34569 -> (5 digits)
1234 -> (4 digits)
3980000 -> (7 digits)
100 -> (3 digits)
9 -> (1 digits)
385784 -> (6 digits)
うーん、多分こんな感じ…?
#define _LEN(x) (sizeof(#x)/sizeof(char)-1)
整数の長さを見つける最も効率的な方法が得られたと思います。これは非常にシンプルでエレガントな方法です。
int PEMath::LengthOfNum(int Num)
{
int count = 1; //count starts at one because its the minumum amount of digits posible
if (Num < 0)
{
Num *= (-1);
}
for(int i = 10; i <= Num; i*=10)
{
count++;
}
return count;
// this loop will loop until the number "i" is bigger then "Num"
// if "i" is less then "Num" multiply "i" by 10 and increase count
// when the loop ends the number of count is the length of "Num".
}
int main(void){unsigned int n、size = 0;
printf("get the int:");
scanf("%u",&n);
/*the magic*/
for(int i = 1; n >= i; i*=10){
size++;
}
printf("the value is: %u \n", n);
printf("the size is: %u \n", size);
return 0;
}
// Variables
long c = 2222882;
long b = c;
float x = 10;
int length = 0;
//Loop to know the length
for(int i = 0; b != 0; i++)
{
b = (float) c / x;
x = x*10;
length++;
}
//Print this one
printf("%i", length);
親切に私の答えを見つけてくださいそれは1行のコードにあります:
#include <stdio.h>
int main(void){
int c = 12388884;
printf("length of integer is: %d",printf("%d",c));
return 0;
}
それはシンプルでスマートです!あなたがこれが好きなら賛成してください!