因此,假设这个函数是如何工作的,如果n2是n1的排列,它假设返回1.如果可以通过重新排列n1的数字形成n2,则n2是n1的排列。 (I.E.237654是743526的排列)。
我不明白如果有人能逐行解释会发生什么我会很感激,谢谢。
int is_permutation_division (unsigned long n1, unsigned long n2)
{
int a[10] = {0,0,0,0,0,0,0,0,0,0};
size_t i;
while (n1 != 0)
{
a[n1 % 10]++; // Edit: little syntax error
n1 /= 10;
}
while (n2 != 0)
{
a[n2 %10]--;
n2 /= 10;
}
for (i=0; i<10; i++)
{
if (a[i] != 0)
{
return 0;
}
}
return 1;
}
下一个函数测试字符串是否是回文序列。一个单词是回文,如果它拼写向后(即赛车rac ecar)时它是相同的
我对我评论的一行有疑问。我只是想知道它的j-1是否因为你不想处理空字符
int is_palindrome(const char s[])
{
size_t i,j;
for (i=0; j<strlen(s); i<j; i++; j--)
{
if(s[i] != s[j-1]) /*is it j-1 because you don't want to check the null character? */
{
return 0;
}
}
return 1;
}
答案 0 :(得分:0)
回文确实是为了避免检查空字符。
答案 1 :(得分:0)
while (n1 != 0)
{
a[n1 % 10]++; // adds one to the array position of last digit. i.e: 42235 -> a[5] goes up by 1.
n1 /= 10; //deletes last number. i.e: 42235 -> 4223
}
这使得a
成为一个数组,每个a[i]
(第i个位置)包含数字i
出现在数字上的次数。例如,对于n1 = 1233210346576
,a
将为{1, 2, 2, 3, 1, 1, 2, 1, 0, 0}
然后,以下部分执行相同但减少数组。我们的数字是一个排列iff a
再次是一个0的数组。
对于第二个,老实说我不明白......如果for循环可以分为5个条款,我不知道......但基本上,你想要比较第i个左边的字母和右边的第i个字母,我从第一个字母到总金额的一半。可能会有一些+ -1s来实现它。
答案 2 :(得分:0)
在is_permutation_division
函数中,
//assume n1 = 237654, n2 = 743526
int is_permutation_division (unsigned long n1, unsigned long n2)
{
int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
//calc num of '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' symbols of n1
size_t i;
while (n1 != 0)
{
a[n1 % 10]++; //a[0] keeps num of '0', a[1] keeps num of '1',...of n1
n1 /= 10;
}// now, a[] = {0,0,1,1,1,1,1,1,0,0}, for n1 = 237654
while (n2 != 0)
{
a[n2 %10]--;// to check the count of '0','1','2'... of n2
n2 /= 10;
}//now, a[] = {0,0,0,0,0,0,0,0,0,0}, since n2 = 743526
//because, n2 has the same digital symbol array,
//all elements of a[] would be 0 by count back
for (i=0; i<10; i++)
{
if (a[i] != 0)
{
return 0;//if there is a non zero element, not permutation, return
}
}// now, a[] is full of 0
return 1;//then n2 is permutation of n1
}
在is_palindrome
函数中,
for (i=0; j<strlen(s); i<j; i++; j--)
//这里有些问题
它应该是:
for (i=0, j = strlen(s); i<j; i++, j--)