我目前在将值重新分配给字符数组时遇到问题。下面是我的代码(未完成的解决方案,以找到下一个最小的回文):
public int nextSmallestPalindrome(int number)
{
string numberString = number.ToString();
// Case 1: Palindrome is all 9s
for (int i = 0; i < numberString.Length; i++)
{
if (numberString[i] != '9')
{
break;
}
int result = number + 2;
return result;
}
// Case 2: Is a palindrome
int high = numberString.Length - 1;
int low = 0;
bool isPalindrome = true;
for (low = 0; low <= high; low++, high--)
{
if (numberString[low] != numberString[high])
{
isPalindrome = false;
break;
}
}
char[] array = numberString.ToCharArray();
if (isPalindrome == true)
{
// While the middle character is 9
while (numberString[high] == '9' || numberString[low] == '9')
{
array[high] = '0';
array[low] = '0';
high++;
low--;
}
int replacedvalue1 = (int)Char.GetNumericValue(numberString[high]) + 1;
int replacedvalue2 = (int)Char.GetNumericValue(numberString[low]) + 1;
StringBuilder result = new StringBuilder(new string(array));
if (high == low)
{
result[high] = (char)replacedvalue1;
}
else
{
Console.WriteLine(result.ToString());
result[high] = (char)replacedvalue1;
Console.WriteLine(result.ToString());
result[low] = (char)replacedvalue2;
}
return Int32.Parse(result.ToString());
}
else return -1;
}
主要课程:
Console.WriteLine(nextSmallestPalindrome(1001));
返回1001,然后返回101,然后在返回Int32.Parse(result.ToString())时给出一个formatexception;声明。
我很困惑,因为我认为在分配结果[high] =(char)replacementvalue1;后,“result”应该是1101。打印replacementvalue1按预期给出“1”。但是,逐行调试显示“1001”在结尾处变为“1 1”,表示奇怪的字符。
可能出现什么问题?
由于
答案 0 :(得分:3)
字符和数字不是一回事。我发现在做这类事情时保持ASCII chart开放最容易。 如果您查看其中一个图表,您会看到字符 0的实际小数值为48。
char c = (char)48; // Equals the character '0'
反过来也是如此:
char c = '0';
int i = (int)c; // Equals the number 48
大部分时间你设法将char
和int
分开,但最后却让他们混淆了:
// Char.GetNumericValue('0') will return the number 0
// so now replacedvalue1 will equal 1
int replacedvalue1 = (int)Char.GetNumericValue(numberString[high]) + 1;
// You are casting the number 1 to a character, which according to the
// ASCII chart is the (unprintable) character SOH (start of heading)
result[high] = (char)replacedvalue1;
仅供参考,您实际上不需要来回投射字符以便对其执行操作。 char c = 'a'; c++;
有效,并且等于表格中的下一个字符('b')。同样,您可以增加数字字符:
char c = '0'; c++; // c now equals '1'
编辑:将整数1转换为字符“1”的最简单方法是将整数“加”到字符“0”:
result[high] = (char)('0' + replacedvalue1);
当然,有更简单的方法可以实现您的目标,但这些技术(转换和添加char
和int
)是很好的工具。
答案 1 :(得分:0)
你没有写那么多代码来做这件事。
这是你的IsPalindrome方法;
private static bool IsPalindrome(int n)
{
string ns = n.ToString(CultureInfo.InvariantCulture);
var reversed = string.Join("", ns.Reverse());
return (ns == reversed);
}
private static int FindTheNextSmallestPalindrome(int x)
{
for (int i = x; i < 2147483647; i++)
{
if (IsPalindrome(i))
{
return i;
}
}
throw new Exception("Number must be less than 2147483647");
}
这就是你怎么称呼它。您不需要数组来调用它。您只需输入小于2147483647的任何数字(int的最大值)并获得下一个回文值。
var mynumbers = new[] {10, 101, 120, 110, 1001};
foreach (var mynumber in mynumbers)
{
Console.WriteLine(FindTheNextPalindrome(mynumber));
}