【发布时间】:2014-09-28 10:42:44
【问题描述】:
我想生成一个函数,它接受一个整数 x 和 char 数组,并返回一个字符串 x 步入序列。
例如,考虑字母“abc”,它会产生字符串 a、b、c、aa、ab、ac、ba、bb、bc、ca、cb、cc、aaa、aab... 如果传入索引 0,我希望输出为“a”;同样,如果传入索引 34,我希望输出 'cbb'。
对于字母 '0123456789',我希望字符串 0、1、2、3、4、5、6、7、8、9、00、01、02、03、04、05、06、07、 08、09、10、11...
到目前为止,我已经写了以下内容,但是在行为偏离的案例 21-23、33-35、45-47 上遇到了问题,我已经盯着这个问题看了好几个小时,没有出现模式跳跃在我身上(关于字母大小和索引)。起初我没有注意到这个问题,使用更大的字母,直到它在我的程序中进一步产生更大的问题。
我不会假装下面的代码很优雅,遵循良好的实践,也没有经过优化——在这个阶段,我真的只是想了解这种模式的正确实现,并且一直在改变一切尝试解决问题。如果变量名称令人困惑,请提前道歉。另外,这是一个常见的模式/问题吗?我试图搜索类似的算法,但无法找到任何与我想到的术语有关的东西。
unsigned long power(int num, int exp)
{
int i;
unsigned long ret = num;
if (exp == 0) return 1;
for (i = 1; i < exp; i++)
{
ret *= num;
}
return ret;
}
unsigned long sumsqr(int base, int exp)
{
unsigned long sum;
for (sum = 0; exp > 0; exp--)
{
sum += power(base, exp);
}
return sum;
}
char * generateStringT(unsigned long index, char * charmap)
{
unsigned long scaler;
unsigned long remainder;
unsigned long divisor;
int base;
int exponent;
int factor;
char * buffer;
char * string;
int i;
buffer = malloc(sizeof(char) * 100);
i = 0;
base = strlen(charmap);
exponent = 0;
divisor = 0;
remainder = index;
while(sumsqr(base, exponent) <= index)
{
exponent++;
}
exponent--;
factor = exponent;
while(factor >= 0)
{
divisor = power(base, factor);
if ((factor > 1) && (exponent > 0))
divisor += power(base, factor-1);
scaler = remainder/divisor;
remainder = remainder - scaler * divisor;
printf("%lu,", scaler);
if ((factor == exponent) && (exponent > 0)) scaler--;
buffer[i++] = charmap[scaler];
factor--;
}
buffer[i++] = '\0';
string = malloc((strlen(buffer) + 1) * sizeof(char));
strcpy(string, buffer);
free(buffer);
return string;
}
【问题讨论】:
-
".. 这是常见的模式/问题吗?"是的:使用
a,b,c的页码通常遵循这种模式(例如,在 PDF 中使用时)。 -
@Jongware 好点!这让我找到了一些有用的东西 - 谢谢! codereview.stackexchange.com/questions/13105/…