C#整数反转函数处理负数及INT_MIN溢出问题求助
解决C#整数反转中INT_MIN溢出的问题
你的核心问题是int.MinValue(即-2147483648)取绝对值时会溢出,因为它的绝对值超过了int.MaxValue(2147483647)。以下是几种可行的解决方案:
方案1:直接处理负数,避免转绝对值
C#中负数的取模和除法操作会保留符号特性,比如-123 % 10返回-3,-123 / 10返回-12,可以直接基于原数的正负处理每一位,无需转绝对值:
public void Reverse(int x) { const int INT_MAX = 2147483647; const int INT_MIN = -2147483648; long reversed = 0; while (x != 0) { int lastDigit = x % 10; reversed = reversed * 10 + lastDigit; // 提前判断是否超出int范围,超出直接置0并终止循环 if (reversed > INT_MAX || reversed < INT_MIN) { reversed = 0; break; } x = x / 10; } Console.WriteLine((int)reversed); }
方案2:先转long类型处理,规避绝对值溢出
将输入的int转为long后,其范围足以容纳int.MinValue的绝对值,再按原逻辑处理:
public void Reverse(int x) { const int INT_MAX = 2147483647; const int INT_MIN = -2147483648; long num = x; bool isNegative = num < 0; if (isNegative) { num = -num; // long类型无溢出风险 } long reversed = 0; while (num != 0) { int lastDigit = (int)(num % 10); reversed = reversed * 10 + lastDigit; num = num / 10; } if (isNegative) { reversed = -reversed; } // 判断反转结果是否在int范围内 if (reversed > INT_MAX || reversed < INT_MIN) { Console.WriteLine(0); return; } Console.WriteLine((int)reversed); }
方案3:纯int操作,提前预判溢出
如果不想使用long类型,可以在每一步计算前判断是否会溢出,完全基于int类型处理:
public void Reverse(int x) { const int INT_MAX = 2147483647; const int INT_MIN = -2147483648; int reversed = 0; while (x != 0) { int lastDigit = x % 10; // 预判正数溢出:reversed超过INT_MAX/10,或等于时最后一位大于7 if (reversed > INT_MAX / 10 || (reversed == INT_MAX / 10 && lastDigit > 7)) { reversed = 0; break; } // 预判负数溢出:reversed小于INT_MIN/10,或等于时最后一位小于-8 if (reversed < INT_MIN / 10 || (reversed == INT_MIN / 10 && lastDigit < -8)) { reversed = 0; break; } reversed = reversed * 10 + lastDigit; x = x / 10; } Console.WriteLine(reversed); }
内容的提问来源于stack exchange,提问作者Murat Ishenbaev
相关产品推荐
相关产品推荐

