Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何计算一个数字中有多少个字符?_C_String_While Loop_Char_Int - Fatal编程技术网

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个前导零。最后,前导零的数量是一个数字