You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:03:27