C++重新排列一个整数
c++ rearranging an integer
我目前是一名 C++ 学生,我正在学习 C++ 的基础知识,如果这对你们来说似乎很简单,但我发现这是我遇到过的最难的问题,请原谅:
给它一个恰好 8 位数的数字 n。求将n的所有数字重新排列得到的最大回文数。
示例:21523531 => 53211235
我知道向量以及如何检查数字是否为回文,我也知道如何从数字中删除每个数字直到它给我一个回文数字,但我不知道如何重新排列所有数字。
这是很简单的逻辑。首先计算 0-9 中不同数字的个数。如果不同的数字不超过 4,则计算每个数字的实例。如果每个数字都是偶数,则找到最大的 4 个数字(所有数字都可以相等)。
首先对它们进行降序排序,然后对它们进行升序排序。
这会起作用。
谢谢你。
在一个偶数k位回文数中,每个数字d都出现
n(d) = 2 * m(d), m(d) in |N u {0}
次。
只需将数字反向排序到数组中 source
并且
(在伪代码中)
for i=0 to i = (k/2)-1
do
target[i] = target[k-1-i] = source[i*2];
done
现在尝试用 C++ 编写代码。
我认为以下代码可以工作:
int func(int x) // returns 0 if there is no valid palindrome
{
int arr[10]{};
while (x)
{
arr[x%10]++;
x /= 10;
}
for (int it : arr)
if (it % 2)
return 0;
int ret = 0;
for (int i = 9; i >= 0; i--)
for (int j = 0; j < arr[i]/2; j++)
ret = ret * 10 + i;
for (int i = 0; i < 10; i++)
for (int j = 0; j < arr[i]/2; j++)
ret = ret * 10 + i;
return ret;
}
这是更适合学生阅读的版本:
int func(int x) // returns 0 if there is no valid palindrome
{
int arr[10] = {0,0,0,0,0,0,0,0,0,0}; // it is digits counter
while (x) // this is executed for each digit in the number
{
arr[x%10]++; // here x%10 is equal to current digit
x /= 10; // remove rightmost digit
}
for (int i = 0; i < 10; i++)
{
if (arr[i] % 2) // Every digit must be repeated 0,2,4,6 or 8 times. If it's not, then there is no valid palindrome
{
return 0;
}
}
int ret = 0; // this is our future result
// Now we just take largest digit that appears in source number and add it to the result. If it appears twice, we add it once. If it appears 4 times, we add it twice and so on.
for (int i = 9; i >= 0; i--)
{
for (int j = 0; j < arr[i]/2; j++)
{
ret = ret * 10 + i;
}
}
// Now we're doing same thing in the reverse direction.
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < arr[i]/2; j++)
{
ret = ret * 10 + i;
}
}
return ret; // we're done now
}
我希望你会发现这个答案有用并且会使用它而不会盲目复制。
我目前是一名 C++ 学生,我正在学习 C++ 的基础知识,如果这对你们来说似乎很简单,但我发现这是我遇到过的最难的问题,请原谅: 给它一个恰好 8 位数的数字 n。求将n的所有数字重新排列得到的最大回文数。 示例:21523531 => 53211235
我知道向量以及如何检查数字是否为回文,我也知道如何从数字中删除每个数字直到它给我一个回文数字,但我不知道如何重新排列所有数字。
这是很简单的逻辑。首先计算 0-9 中不同数字的个数。如果不同的数字不超过 4,则计算每个数字的实例。如果每个数字都是偶数,则找到最大的 4 个数字(所有数字都可以相等)。 首先对它们进行降序排序,然后对它们进行升序排序。 这会起作用。 谢谢你。
在一个偶数k位回文数中,每个数字d都出现
n(d) = 2 * m(d), m(d) in |N u {0}
次。
只需将数字反向排序到数组中 source
并且
(在伪代码中)
for i=0 to i = (k/2)-1
do
target[i] = target[k-1-i] = source[i*2];
done
现在尝试用 C++ 编写代码。
我认为以下代码可以工作:
int func(int x) // returns 0 if there is no valid palindrome
{
int arr[10]{};
while (x)
{
arr[x%10]++;
x /= 10;
}
for (int it : arr)
if (it % 2)
return 0;
int ret = 0;
for (int i = 9; i >= 0; i--)
for (int j = 0; j < arr[i]/2; j++)
ret = ret * 10 + i;
for (int i = 0; i < 10; i++)
for (int j = 0; j < arr[i]/2; j++)
ret = ret * 10 + i;
return ret;
}
这是更适合学生阅读的版本:
int func(int x) // returns 0 if there is no valid palindrome
{
int arr[10] = {0,0,0,0,0,0,0,0,0,0}; // it is digits counter
while (x) // this is executed for each digit in the number
{
arr[x%10]++; // here x%10 is equal to current digit
x /= 10; // remove rightmost digit
}
for (int i = 0; i < 10; i++)
{
if (arr[i] % 2) // Every digit must be repeated 0,2,4,6 or 8 times. If it's not, then there is no valid palindrome
{
return 0;
}
}
int ret = 0; // this is our future result
// Now we just take largest digit that appears in source number and add it to the result. If it appears twice, we add it once. If it appears 4 times, we add it twice and so on.
for (int i = 9; i >= 0; i--)
{
for (int j = 0; j < arr[i]/2; j++)
{
ret = ret * 10 + i;
}
}
// Now we're doing same thing in the reverse direction.
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < arr[i]/2; j++)
{
ret = ret * 10 + i;
}
}
return ret; // we're done now
}
我希望你会发现这个答案有用并且会使用它而不会盲目复制。