打印 BASE62 中的前 N 个数字
Print first N numbers in BASE62
我想以 BASE62 编码打印前 N 个数字。我的代码有什么问题?
const char ALPHABET[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main(void) {
int N = 50;
for (int i = 0; i < N; i++) {
int base62 = ALPHABET[i % 62];
printf("Base 62: %s\n", (char*)base62);
}
}
ALPHABET
是一个字符数组,所以你应该可以使用 char base 62 ...
和 printf("Base 62: %c\n", base62);
将普通的 int
转换为指针并将其传递给原始代码中的 printf 将导致 printf 进行无效的内存读取(未定义的行为)。
您需要打印出表示 base62 数字的字符串。对于 N >= 62,您将得到一个多字符字符串。
首先,您需要计算 base62 表示中的位数,然后逐个字符显示。
为此,您需要这样的东西-
// Count the number of characters the number will need
int num_digits(int num) {
int count=0;
while(num > 0) {
num /= 62;
count++;
}
if(count == 0)
count = 1;
return count;
}
int main() {
const char ALPHABET[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i, N=100;
char STR[10];
for (i = 0; i < N; i++) {
int num = i;
int digits = num_digits(num);
STR[digits] = '[=10=]';
while(num > 0) {
char base62 = ALPHABET[num % 62];
STR[--digits] = base62;
num /= 62;
}
if(i == 0)
STR[--digits] = ALPHABET[0];
printf("%s\n", i, STR);
}
}
接受简化后
正如 Cool Guy 评论的那样,printf("Base 62: %s\n", (char*)base62);
不会将 int
转换为所需的字符数组。下面的代码分解值,一次分解一个 base-62 字符。
void print_base(unsigned n, unsigned base) {
static const char ALPHABET[] =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (n >= base) {
print_base(n / base, base);
}
fputc(ALPHABET[n % base], stdout);
}
#include <stdio.h>
int main(void) {
print_base(100, 10); // 100
puts("");
print_base(100, 16); // 64
puts("");
print_base(100, 62); // 1C
puts("");
return 0;
}
我想以 BASE62 编码打印前 N 个数字。我的代码有什么问题?
const char ALPHABET[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main(void) {
int N = 50;
for (int i = 0; i < N; i++) {
int base62 = ALPHABET[i % 62];
printf("Base 62: %s\n", (char*)base62);
}
}
ALPHABET
是一个字符数组,所以你应该可以使用 char base 62 ...
和 printf("Base 62: %c\n", base62);
将普通的 int
转换为指针并将其传递给原始代码中的 printf 将导致 printf 进行无效的内存读取(未定义的行为)。
您需要打印出表示 base62 数字的字符串。对于 N >= 62,您将得到一个多字符字符串。 首先,您需要计算 base62 表示中的位数,然后逐个字符显示。
为此,您需要这样的东西-
// Count the number of characters the number will need
int num_digits(int num) {
int count=0;
while(num > 0) {
num /= 62;
count++;
}
if(count == 0)
count = 1;
return count;
}
int main() {
const char ALPHABET[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i, N=100;
char STR[10];
for (i = 0; i < N; i++) {
int num = i;
int digits = num_digits(num);
STR[digits] = '[=10=]';
while(num > 0) {
char base62 = ALPHABET[num % 62];
STR[--digits] = base62;
num /= 62;
}
if(i == 0)
STR[--digits] = ALPHABET[0];
printf("%s\n", i, STR);
}
}
接受简化后
正如 Cool Guy 评论的那样,printf("Base 62: %s\n", (char*)base62);
不会将 int
转换为所需的字符数组。下面的代码分解值,一次分解一个 base-62 字符。
void print_base(unsigned n, unsigned base) {
static const char ALPHABET[] =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (n >= base) {
print_base(n / base, base);
}
fputc(ALPHABET[n % base], stdout);
}
#include <stdio.h>
int main(void) {
print_base(100, 10); // 100
puts("");
print_base(100, 16); // 64
puts("");
print_base(100, 62); // 1C
puts("");
return 0;
}