我是编程的初学者,我以前从未在这里发帖。我已经找到了我的问题的答案,其中一个帖子是here ......但是我无法让他们的方法起作用。
我正试图通过做一些Project Euler挑战来学习C.对于其中一个挑战,我需要检查一个数字是否是回文。我以为我会通过将我的目标整数(称为product)加载到数组中来执行此操作,然后再检查元素对(寻找对称性)。
首先,我检查一下我的产品有多长:
productLength = ceil(log10(product));
然后我有一个循环尝试将该整数加载到我的数组中,名为inspection:
for(x = productLength; x <= 0; x--) //decrement from product length and loop
{
inspection[x - 1] = product % 10; //transfer product values to inspection array
product /= 10; //prepare product value for next pass (move digits one place to the right)
}
这似乎不起作用。我知道这可能是一些愚蠢的错误,但我无法发现它。
答案 0 :(得分:1)
这一行
for(x = productLength; x <= 0; x--)
应该是:
for(x = productLength; x >= 0; x--)
但是,这里有另一个问题。
inspection[x - 1] = product % 10; //transfer product values to inspection array
循环将达到x = 0(包括x = 0),因此当x = 0时,这将导致索引无效。
所以循环应该如下所示:
for(x = productLength-1; x >= 0; x--)
{
inspection[x] = product % 10;
product /= 10;
}
inspection[productLength] = 0;
答案 1 :(得分:0)
你的for循环应该是:
for(x = productLength; x >= 0; x--)
而不是for(x = productLength; x <= 0; x--)
答案 2 :(得分:0)
所以这一行
productLength = ceil(log10(product));
应该更容易
productLength = log10(product) + 1;
作为
unsigned x = <some value > 0>;
size_t s = log10(x);
是
0 for all values of x < 10
1 for all values of x < 100
2 for all values of x < 1000
...
使用ceil()
有效,但我觉得使用它有点矫枉过正。
解决方案:
size_t productLength = log10(product) + 1;
unsigned char inspection[productLength];
for (size_t x = productLength - 1; x >= 0; --x) //decrement from product length and loop
{
inspection[x] = product % 10; //transfer product values to inspection array
product /= 10; //prepare product value for next pass (move digits one place to the right)
}
答案 3 :(得分:0)
如果它是一个整数你需要进行回文检查,那么你可以只用字符串打印它并开始比较两端的字符:
int palindromic(int n)
{
char str[20];
int result;
int i;
sprintf(str, "%d", n);
int length = strlen(str);
for (result = 1, i = 0; i < length / 2 && result == 1; i++)
{
result = (str[i] == str[length - 1 - i]);
}
return result;
}