我看到一个问题,它被告知存在一个字符串,该字符串由“ 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语言的新手。任何帮助将不胜感激...
答案 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编程或字符串处理。也许最简单的方法是将字符串想象成由几个数字“块”组成。
因为我们知道每个块的偏移量,所以我们可以计算全局偏移量k
对应的块内的偏移量 。
例如,如果k = 207
,我们知道相关数字必须在块3中开始(数字范围100
至999
),并且其在该块中的偏移量为{{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()