获取整数位数
Getting number of int digits
我正在使用 fscanf(fp, "%d", &n)
函数从文件中读取一个整数。
有没有办法知道这个数字有多少位没有循环?
是的,将其作为字符串读取:
char buffer[256];
fscanf(fp, "%s", buffer);
int length = strlen(buffer);
注意:如果它是负数,您可能需要打折 -
符号...
假设您仍然想要整数值:
int n = atoi(buffer);
int optionalwhitespace, characters;
if (fscanf(fp, " %n%d%n", &optionalwhitespace, &n, &characters) != 1) /* error */;
characters -= optionalwhitespace;
// characters now has the number of characters read to interpret the value in n
#include<math.h>
//rest of program
fscanf(fp, "%d", &n)
int length = (int)(log10(n)) +1;
//rest of program
你可以试试:
int count = 0;
fscanf(fp, "%d%n", &n, &count);
%n
说明符输入 count
到目前为止读取的字符数。
但是,此数字可以大于 n
的位数,因为 %d
说明符允许在读取数字之前跳过空白字符。
检查@pmg 的 以了解如何计算这些空格。
通过使用log
函数:
int number_of_digits(unsigned int i)
{
return (int)(log(i+1) / log(10)) + 1;
}
int main (void)
{
int i = 52;
printf("%d has %d digits\n", number_of_digits(i));
}
您可以使用 snprinf
,这是比 itoa
更好的选择:
int x = 0;
scanf( "%d", &x );
char buffer[20] = "";
snprintf(buffer, sizeof(buffer), "%d", x);
printf( "num of digits = %d", strlen(buffer) );
试试这个:
#include <math.h>
number > 0 ? (int) log10 ((double) number) + 1 : 1;
您可以只数 log10
个数字,然后像这样四舍五入:
int length = ceil(log10((double)n)) + 0.5;
+ 0.5
用于将浮点数转换为整数,因为像 3 这样的数字不能明确地写在浮点表示中 (int)3.0
可能会产生 2。我假设 ceil
return 不会被 0.5
回答,这永远不会发生。
Is there a way to know how many digits that number has without loops?
递归解决方案
unsigned digit_count(unsigned x) {
if (x >= 10) return digit_count(x /10) + 1;
return 1;
}
对于代码高尔夫方法,只需 return snprintf()
的值
width = snprintf(0, 0, "%u", (unsigned) n);
我正在使用 fscanf(fp, "%d", &n)
函数从文件中读取一个整数。
有没有办法知道这个数字有多少位没有循环?
是的,将其作为字符串读取:
char buffer[256];
fscanf(fp, "%s", buffer);
int length = strlen(buffer);
注意:如果它是负数,您可能需要打折 -
符号...
假设您仍然想要整数值:
int n = atoi(buffer);
int optionalwhitespace, characters;
if (fscanf(fp, " %n%d%n", &optionalwhitespace, &n, &characters) != 1) /* error */;
characters -= optionalwhitespace;
// characters now has the number of characters read to interpret the value in n
#include<math.h>
//rest of program
fscanf(fp, "%d", &n)
int length = (int)(log10(n)) +1;
//rest of program
你可以试试:
int count = 0;
fscanf(fp, "%d%n", &n, &count);
%n
说明符输入 count
到目前为止读取的字符数。
但是,此数字可以大于 n
的位数,因为 %d
说明符允许在读取数字之前跳过空白字符。
检查@pmg 的
通过使用log
函数:
int number_of_digits(unsigned int i)
{
return (int)(log(i+1) / log(10)) + 1;
}
int main (void)
{
int i = 52;
printf("%d has %d digits\n", number_of_digits(i));
}
您可以使用 snprinf
,这是比 itoa
更好的选择:
int x = 0;
scanf( "%d", &x );
char buffer[20] = "";
snprintf(buffer, sizeof(buffer), "%d", x);
printf( "num of digits = %d", strlen(buffer) );
试试这个:
#include <math.h>
number > 0 ? (int) log10 ((double) number) + 1 : 1;
您可以只数 log10
个数字,然后像这样四舍五入:
int length = ceil(log10((double)n)) + 0.5;
+ 0.5
用于将浮点数转换为整数,因为像 3 这样的数字不能明确地写在浮点表示中 (int)3.0
可能会产生 2。我假设 ceil
return 不会被 0.5
回答,这永远不会发生。
Is there a way to know how many digits that number has without loops?
递归解决方案
unsigned digit_count(unsigned x) {
if (x >= 10) return digit_count(x /10) + 1;
return 1;
}
对于代码高尔夫方法,只需 return snprintf()
width = snprintf(0, 0, "%u", (unsigned) n);