C#实现Narcissistic Number代码执行超时,求优化方案
自恋数代码超时问题优化方案
首先看你代码里导致超时和逻辑错误的核心问题:
核心错误分析
- 位数计算循环逻辑错误:第一个循环里,
value = value%10;直接把value替换成了最后一位数字,紧接着value=value/10就会把value变成0,不管输入是几位数,最终digit都会是1,完全没正确统计位数。 - 死循环导致超时:第二个求和循环里,你写的是
num=num/10;,但真正需要更新的是tempValue,否则tempValue一直不变,循环永远不会终止,这就是超时的直接原因。 - 自定义pow效率低下:自己实现的循环求幂在数字较大时会增加不必要的计算开销,而且没有处理幂次为0的边界情况(比如输入0时)。
优化后的代码
public class Kata { public static bool Narcissistic(int value) { if (value == 0) return true; // 处理0的边界情况 int tempValue = value; int digitCount = 0; // 正确统计位数 while (tempValue != 0) { digitCount++; tempValue /= 10; } tempValue = value; long sum = 0; // 用long避免int溢出 // 计算各位数字的digitCount次幂之和 while (tempValue != 0) { int digit = tempValue % 10; sum += (long)System.Math.Pow(digit, digitCount); tempValue /= 10; } return sum == value; } }
优化细节说明
- 修复位数统计逻辑:直接在循环里对tempValue做整除10操作,同时计数,正确统计数字的位数。
- 解决死循环问题:求和循环里更新tempValue为
tempValue /= 10,确保循环能正常终止。 - 替换自定义pow:使用.NET内置的
Math.Pow,它的实现经过优化,比自己写的循环求幂效率更高。 - 避免溢出:用
long类型存储求和结果,防止当数字较大时,int类型无法容纳幂次求和的结果导致溢出错误。 - 处理边界情况:单独处理输入为0的情况,因为0是自恋数(0^1=0),而且原代码的位数统计循环不会处理0的情况。
内容的提问来源于stack exchange,提问作者HavaDev
相关产品推荐
相关产品推荐

