将生成的整数存储到数组中以生成字符串

时间:2019-06-12 17:49:04

标签: c string

我看到一个问题,它被告知存在一个字符串,该字符串由“ 123456789101112131415 ... k” 之类的数字组成,其中k是用户的输入。 k 是这里唯一的输入。该字符串是根据输入生成的。假设我输入11。字符串为“ 1234567891011” 。它被告知生成string的 k-th 元素。 例如,对于k = 21,输出将为5。

在C ++中,我实际上可以创建一个字符串类型数组,并通过 to_string 函数将for循环中的整数存储到其中。但是,我实际上在C语言中无所适从。我知道的将字符串扫描到数组中的唯一一件事是:

scanf(" %[^\n]", array); 

来源:https://codeforces.com/problemset/problem/1177/A

我是C语言的新手。任何帮助将不胜感激...

2 个答案:

答案 0 :(得分:0)

以下完整示例与您在C ++中描述的等效于C:

#include <stdio.h>
#include <string.h>
#define SIZE 1024

int main(void)
{
  int k;
  scanf("%d", &k);  // read input

  char str[SIZE] = {0};
  char generated_str[SIZE] = {0};

  for(int i = 1; i <= k; i++)
  {
    sprintf(str, "%d", i);        // convert int to string
    strcat(generated_str, str);   // append current term to the overall string
  }

  printf("%s\n", generated_str);
  printf("%c\n", generated_str[k - 1]);
  return 0;
}

输出:

123456789101112131415161718192021
5

注意:也许有一种算法可以做到这一点。考虑一下每个数字的位数。然后考虑如何使用模和除法运算符(乘以10)从数字中获得所需的内容。之后,您应该去玩得开心。

答案 1 :(得分:0)

正如我在评论中提到的那样,这更多是算法设计问题,而不是C编程或字符串处理。也许最简单的方法是将字符串想象成由几个数字“块”组成。

  • 块1由数字1-9组成,从偏移量0开始
  • 第2块包含数字10-99,从偏移量9开始
  • 第3块包含数字100-999,从偏移量189开始

因为我们知道每个块的偏移量,所以我们可以计算全局偏移量k对应的块内的偏移量

例如,如果k = 207,我们知道相关数字必须在块3中开始(数字范围100999),并且其在该块中的偏移量为{{1} }。由于此块中的每个数字都有3位数字,因此偏移量8必须与该块中的第三个数字相对应-207 - 189 = 8。而且由于8的余数除以3是2,所以我们知道我们正在寻找该数字的第三个数字(索引从0开始)。

图片将有助于解释这一点-但是太晚了,所以...

在代码中...

102

在数字中查找特定数字的助手...

static char find_kth_digit(int k) {
    int offset = 0;        // Global offset
    int block_length = 0;  // Length of current 'block'
    int offset_inner = 0;  // Offset within current block
    // Power to which 10 is currently raised
    int l = 1;
    int start = 1, end = 10;  // start / end of current block
    char digit = '0';         // result

    if (k == 0) { 
        return -1;
    }

    // Our indices start at 0 - while the question demands they begin at 1.
    k--;

    while (l < 5) {  // Only required to go up to k = 10000
        end = start * 10;
        offset_inner = k - offset;
        // How many digits overall in the current block of numbers?
        block_length = l * (end - start);
        // Update global offset
        offset = offset + block_length;
        // Is k within these block?
        if (k < offset) {
            int n = start + offset_inner / l;
            int d = offset_inner % l;
            return kth_digit_from_end_of_n(n, l - d);
        }
        l++;
        start = end;
    }

    if (l == 5) {
        return -1;
    }

    return digit;
}

请注意-在内部-该算法使用的索引从0开始,而您链接的问题期望的索引从1开始。因此,需要在主static char kth_digit_from_end_of_n(int n, int k) { char c = '0'; while (k--) { c = n % 10; n /= 10; } return c + '0'; } 循环之前减小偏移量:

while()