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

如何解决7位自幂数查找程序运行超时问题?

解决7位自幂数查找超时的问题

你的代码超时主要有两个核心原因:

  • 频繁调用pow()函数进行浮点运算,不仅效率低下,还可能带来精度误差
  • 对每个数字重复计算各位的n次幂,没有复用计算结果

另外注意你的代码里存在一个拼写错误:main()函数中调用的nacissistic多写了一个字母s,正确的函数名是narcissistic,这会导致编译失败,优化后的代码已经修正了这个问题。

以下是针对性的优化方案:

优化点1:预计算0-9的n次幂

提前算出0到9每个数字的n次方并存在数组里,后续直接查表取值,避免重复调用pow()的开销。浮点运算本身比整数运算慢很多,而且pow()的内部实现复杂度较高,重复调用会大幅拖慢程序运行速度。

优化点2:用整数运算替代pow()计算范围

pow(10,n)是浮点运算,可能出现精度偏差(比如pow(10,7)可能得到9999999.999999,转成int后变成9999999),导致范围计算错误。改用整数循环乘法计算min和max,既准确又高效。

优化后的代码

#include<stdio.h>

// 预存0-9的n次幂,用long long避免溢出
long long power[10];

int narcissistic(int num, int n);
int main(){
    int n;
    int i, min, max;
    scanf("%d", &n);
    
    // 预计算0-9的n次方
    for(int k=0; k<10; k++){
        power[k] = 1;
        for(int m=0; m<n; m++){
            power[k] *= k;
        }
    }
    
    // 用整数运算计算N位数的范围
    min = 1;
    for(int k=0; k<n-1; k++){
        min *= 10;
    }
    max = min * 10 - 1;
    
    for(i=min; i<=max; i++){
        if(narcissistic(i, n)){
            printf("%d\n", i);
        }
    }
    return 0;
}

int narcissistic(int num, int n){
    int renum = num;
    // 用long long存储sum,避免计算过程中溢出(n=7时最大sum为9^7*7=33480783,虽未超出int上限,但扩展场景更稳妥)
    long long sum = 0;
    int digit;
    while(renum != 0){
        digit = renum % 10;
        renum = renum / 10;
        sum += power[digit];
        // 提前剪枝,sum超过num直接跳出
        if(sum > num){
            break;
        }
    }
    return (sum == num);
}

优化效果说明

预计算幂次的操作只需要执行一次,而不是对每个数字重复计算,这会将n=7时的运算量大幅降低——原本900万次循环里的每一次位运算都要调用pow(),现在直接查表取值,效率提升非常明显。同时整数运算替代浮点运算也避免了精度问题,保证范围计算准确。

内容的提问来源于stack exchange,提问作者Aida111111111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:22:14