我正在尝试编写一个函数来打印具有给定基数和位数的位置数字系统。例如,当 Base = 2 和 nDigits = 3 时,输出必须是这样的:
000
001
010
011
...
111
现在,我尝试做一些事情,但我只是失败了。考虑到我无法存储数字,我只需要打印它们,这就是我使用“支持”数组的动态分配的原因。到目前为止,这就是我尝试做的,显然没有按照预期的方式去做......我认为唯一正确的部分是打印 Base^nDigits 的所有组合。 (b=base, n=nDigits).
void printNumeration(int b, int n){
int i, j=0;
int *array = calloc(n, sizeof(int));
if (array == NULL){
printf("Allocation failed.\n");
exit(0);
}
for (i=0; i<pow(b, n); i++){
for (j=0; j<n; j++){
printf("%d", array[j]);
array[j]++;
if (array[j] == n){
array[j] = 0;
}
}
printf("\n");
}
}
如果我的完全错误,您还可以提供一些关于更好解决方案的提示。
最佳答案
首先,不要对整数使用 pow
。 - 至少不能不进行四舍五入。 pow
使用不精确的浮点算法进行取幂。就在上周有一个问题因为pow(10, 2)
was 99.9999999... which truncated to int was 99
而出错。 .
也就是说,很可能有一个平台,其中 pow(2, 3)
如您的示例所示,结果为 7.999999...
;由于仅通过截断小数将 double 转换为整数,这意味着您的代码运行 7 个循环而不是 8 个循环! double
比较也是如此; 8.0 仍然大于 7.999999999999999。因此我们使用 round
以确保将结果数字正确舍入为最接近的整数值(在本例中为 8.0)。
此外,您还需要事先计算这个数字,而不是针对每个循环迭代。
我们有 2 个内部循环。首先打印数字,然后向后工作 - 如果第 k
位等于 b
,我们将其设置为 0,我们将 k 减 1,现在增加 k
第一个数字,然后重复。
最后,记得释放calloc分配的内存。
void printNumeration(int b, int n) {
int *digits = calloc(sizeof(int), n);
int max = round(pow(b, n));
for (int i = 0; i < max; i ++) {
for (int j = 0; j < n; j ++) {
printf("%d", digits[j]);
}
int k = n - 1;
digits[k] ++;
while (k && digits[k] == b) {
digits[k] = 0;
k--;
digits[k] ++;
}
printf("\n");
}
free(digits);
}
关于c - 在 C 中打印位置数字系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957162/