如何解决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
相关产品推荐
相关产品推荐

