C 如何计算一个数字中有多少个字符?
因此,长度:C 如何计算一个数字中有多少个字符?,c,string,while-loop,char,int,C,String,While Loop,Char,Int,因此,长度: int test1=1长度为1个字符 int test2=37长度为2个字符 int test3=82342长度为5个字符 我可以使用以下方法找到这些int的字符长度: int character\u len=floor(log10(abs(无论什么值))+1 我想计算inti=1一直到n,但在示例代码中,我只使用了20)。有没有一种方法可以让我计算出我将使用的字符总数,而不必使用第一个while循环来确定我必须使用malloc的大小。我正在尝试计算我应该malloc int
int test1=1
长度为1个字符
int test2=37
长度为2个字符
int test3=82342
长度为5个字符
我可以使用以下方法找到这些int的字符长度:
int character\u len=floor(log10(abs(无论什么值))+1代码>
我想计算inti=1
一直到n
,但在示例代码中,我只使用了20
)。有没有一种方法可以让我计算出我将使用的字符总数,而不必使用第一个while循环来确定我必须使用malloc的大小。我正在尝试计算我应该malloc
int total_characters_needed = 0;
int i = 1;
while (i <= 20) {
total_characters_needed += floor(log10(abs(i))) + 1;`
i++;
}
char *my_numbers_as_a_string = malloc(sizeof(char) * total_characters_needed);
i = 1;
while (i <= 20) {
sprintf(my_numbers_as_a_string, "%d", i);
i++;
}
printf("%s\n", my_numbers_as_a_string);
// Should print out:
// 1234567891011121314151617181920
//
// If the above is unread-able its basically
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
int所需字符总数=0;
int i=1;
当(i要计算从1到n的数字时写入的位数,请使用
unsigned long digits(unsigned long n)
{
unsigned long total = 0;
for (unsigned long i = 1; i <= n; i *= 10){
total += (1 + n - i);
}
return total;
}
无符号长数字(无符号长n)
{
无符号长总计=0;
对于(无符号长i=1;i要计算从1到n的数字写入的位数,请使用
unsigned long digits(unsigned long n)
{
unsigned long total = 0;
for (unsigned long i = 1; i <= n; i *= 10){
total += (1 + n - i);
}
return total;
}
无符号长数字(无符号长n)
{
无符号长总计=0;
对于(无符号长i=1;i这更像是一个难题。您希望将从1到某个数字的数字序列x存储在字符串中,因此需要所有字符的总和。
例如,设x=77867。因此x是一个5个字符长的数字。这可以通过用户10334659给出的循环找到
首先要注意的是,从1到最多4位的数字基本上是填充的,不依赖于x的值。因此,我们可以首先计算这些数字的字符数
1-9:单个数字。#数字=9。=>字符=9 x 1
10-99:2个字符。#数字=90。=>字符=90 x 2
100-999:3个字符。#数字=900。=>字符=900 x 3
1000-9999:4个字符。#数字=9000。=>字符=9000 x 4
因此,从1到最大y-位数的所有数字的总字符数为:
9(10^0 x 1+10^1 x 2+…+10^(y-1)x y)
现在我们只需要计算从10^(y)
到x(这是一个(y+1)位数)的总数。对于我们的例子,10000-77867:#numbers=67688=>characters=67688x5
时间复杂性
设最大数为n。然后可以在O(log(n))时间内计算y+1。查找从1到y的字符数也需要O(log(n))时间。最后,在O(1)时间内找到从10^y到n的字符数
因此,该算法可以找到O(log(n))时间中的字符总数,而不是原始的O(n)时间循环。这是一个更复杂的问题。您希望以字符串形式存储从1到某个数x的数字序列,因此需要所有字符的总数。
例如,设x=77867。因此x是一个5个字符长的数字。这可以通过用户10334659给出的循环找到
首先要注意的是,从1到最多4位的数字基本上是填充的,不依赖于x的值。因此,我们可以首先计算这些数字的字符数
1-9:单个数字。#数字=9。=>字符=9 x 1
10-99:2个字符。#数字=90。=>字符=90 x 2
100-999:3个字符。#数字=900。=>字符=900 x 3
1000-9999:4个字符。#数字=9000。=>字符=9000 x 4
因此,从1到最大y-位数的所有数字的总字符数为:
9(10^0 x 1+10^1 x 2+…+10^(y-1)x y)
现在我们只需要计算从10^(y)
到x(这是一个(y+1)位数)的总数。对于我们的例子,10000-77867:#numbers=67688=>characters=67688x5
时间复杂性
设最大数为n。然后可以在O(log(n))时间内计算y+1。查找从1到y的字符数也需要O(log(n))时间。最后,在O(1)时间内找到从10^y到n的字符数
因此,该算法可以找到O(log(n))时间中的字符总数,而不是原始的O(n)时间循环。以下代码计算从1到n
的所有整数的十进制数字的总位数:
int Digits = 0;
int LeadingZeros = 0;
for (int t = n; 0 < t; t /= 10)
{
++Digits;
LeadingZeros = 10*LeadingZeros + 1;
}
int TotalDigits = Digits * (n+1) - LeadingZeros;
int位数=0;
int LeadingZeros=0;
对于(int t=n;0
推理:循环计算n
中的位数,将该数字放入位数中。如果我们将0到n
之间的所有整数都写为带位数的十进制数字(使用前导零,如“003”),则将使用位数*(n+1)
数字。从中,我们要减去前导零的数量。(对于零,我们要减去它的所有零,因此它对我们的计数没有净影响。)
对于n
从1到9,只有一个“0”要减去,一个代表0。对于n
从10到99,我们要减去“01”到“09”中的9个前导零,以及“00”中的两个零因此,对于10到99,我们在1到9中减去了与n
相同的一个前导零,但也减去了十个前导零。类似地,对于n
从100到999,我们在0到99之间减去这些前导零加上100个前导零。最后,前导零的数量是一个数字