首先了解自幂数的定义,自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153,153即是n为3时的一个自幂数)
自幂数包括:独身数、水仙花数、四叶玫瑰数、五角星数、六合数、北斗七星数、八仙数、九九重阳数、十全十美数。
先介绍基本的方法,代码如下:

#include <stdio.h>
#include <time.h>
#include <math.h>#include "Nmec.h"boolean isSelfPower(int num);
int intLen(int num);boolean isSelfPower(int num) {int n;int len;int sum = 0;len = intLen(num);for (n = num; n; n /= 10) {sum += pow(n % 10, len);}return num == sum;
}int intLen(int num) {int cnt = 0;while(num) {cnt++;num /= 10;}return cnt;
}int main() {int maxNum;int i;long startTime;long endTime;long deltaTime;printf("请输入数值范围:");scanf("%d", &maxNum);startTime = clock();for (i = 0; i < maxNum; i++) {if (isSelfPower(i)) {printf("%d是自幂数\n", i);}}endTime = clock();deltaTime = endTime - startTime;printf("耗时:%ld.%03lds", deltaTime / CLOCKS_PER_SEC, deltaTime % CLOCKS_PER_SEC);return 0;
}

代码中的头文件 **“Nmec.h”**内容如下:

#ifndef _NMEC_H_
#define _NMEC_H_typedef unsigned char boolean;#define TRUE  1
#define FALSE   0
#define NOT_FOUND   -1#endif

按照这个方法寻找9位数内的自幂数, 所需时间很长,等了6分钟就没在等。 下面介绍一种可以在一分半内找出9位数内的自幂数,话不多说放代码:

#include <stdio.h>
#include <time.h>#include "Nmec.h"const int array[][10] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,0, 1, 2*2, 3*3, 4*4, 5*5, 6*6, 7*7, 8*8, 9*9,0, 1, 2*2*2, 3*3*3, 4*4*4, 5*5*5, 6*6*6, 7*7*7, 8*8*8, 9*9*9,0, 1, 2*2*2*2, 3*3*3*3, 4*4*4*4, 5*5*5*5, 6*6*6*6, 7*7*7*7, 8*8*8*8, 9*9*9*9,0, 1, 2*2*2*2*2, 3*3*3*3*3, 4*4*4*4*4, 5*5*5*5*5, 6*6*6*6*6, 7*7*7*7*7, 8*8*8*8*8, 9*9*9*9*9,0, 1, 2*2*2*2*2*2, 3*3*3*3*3*3, 4*4*4*4*4*4, 5*5*5*5*5*5, 6*6*6*6*6*6, 7*7*7*7*7*7, 8*8*8*8*8*8, 9*9*9*9*9*9,0, 1, 2*2*2*2*2*2*2, 3*3*3*3*3*3*3, 4*4*4*4*4*4*4, 5*5*5*5*5*5*5, 6*6*6*6*6*6*6, 7*7*7*7*7*7*7, 8*8*8*8*8*8*8, 9*9*9*9*9*9*9,0, 1, 2*2*2*2*2*2*2*2, 3*3*3*3*3*3*3*3, 4*4*4*4*4*4*4*4, 5*5*5*5*5*5*5*5, 6*6*6*6*6*6*6*6, 7*7*7*7*7*7*7*7, 8*8*8*8*8*8*8*8, 9*9*9*9*9*9*9*9,0, 1, 2*2*2*2*2*2*2*2*2, 3*3*3*3*3*3*3*3*3, 4*4*4*4*4*4*4*4*4, 5*5*5*5*5*5*5*5*5, 6*6*6*6*6*6*6*6*6, 7*7*7*7*7*7*7*7*7, 8*8*8*8*8*8*8*8*8, 9*9*9*9*9*9*9*9*9,
};boolean isSelfPower(int num);
int intLen(int num);
int numPower(int a, int p);boolean isSelfPower(int num) {int n;int len;int sum = 0;len = intLen(num);for (n = num; n; n /= 10) {sum += numPower(n % 10, len);     }return num == sum;
}int intLen(int num) {if (num < 0) {return 0;}if (num >= 100000000 && num <= 999999999) {return 9;}if (num >= 10000000 && num <= 99999999) {return 8;}if (num >= 1000000 && num <= 9999999) {return 7;}if (num >= 100000 && num <= 999999) {return 6;}if (num >= 10000 && num <= 99999) {return 5;}if (num >= 1000 && num <= 9999) {return 4;}if (num >= 100 && num <= 999) {return 3;}if (num >= 10 && num <= 99) {return 2;}return 1;
}int numPower(int a, int p) {return array[p][a];
}int main() {int maxNum;int i;long startTime;long endTime;long deltaTime;printf("请输入数值范围:");scanf("%d", &maxNum);startTime = clock();for (i = 0; i < maxNum; i++) {if (isSelfPower(i)) {printf("%d是自幂数\n", i);}}endTime = clock();deltaTime = endTime - startTime;printf("耗时:%ld.%03lds", deltaTime / CLOCKS_PER_SEC, deltaTime % CLOCKS_PER_SEC);return 0;
}

第二种方法程序运行结果如下:

由此可见,第二种方法出结果速度明显加快。对于比较好的机子,可以将时间控制在一分半内。
至此,我的第一篇博文就此问世,在此感谢教主的教诲。

快速寻找9位数内的自幂数相关推荐

  1. 编程之美2.12 快速寻找满足条件的两个数

      这道题目的意思是,在一个数组中寻找两个数,使这两个数的和等于给定的数(找到任意一组就可以了).       题目读完之后,感觉这道题目还是很简单的,就是遍历数组呗,走两遍,即可以在O(n2)时间复 ...

  2. python 多条件 选择 算法_python部署python算法 - 快速寻找满足条件的两个数

    题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二 ...

  3. java求六位数以内所有自幂数

    如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数. 以下用java语言求六位数以内所有自幂数. 独身数共有9个: 1,2,3,4,5,6,7,8,9; 水仙花 ...

  4. 快速寻找勾股数算法的实现和优化

    快速寻找勾股数算法的实现和优化 深夜隔壁寝室的老哥来访,说他用python实现的寻找2000以内勾股数的算法跑了20秒钟.邀请我一起讨论优化思路,完成后记录如下: 朴素探数法寻找勾股数 首先实现那个需 ...

  5. 【网络爬虫教学】一分钟带你快速寻找JS加密入口(二)

    Hi,大家好,欢迎大家参阅由IT猫之家精心制作的JS实战系列教学课程,我是作者叮当猫,在上期教学中,我们学习了如何快速分析基于Header授权加密协议,同时我们也初次接触到了钩子(hook)的概念,钩 ...

  6. opencv python3 找图片不同_如何使用OpenCV快速寻找定位图像差异

    原标题:如何使用OpenCV快速寻找定位图像差异 如何使用结构相似性指数(SSIM)将两个图像与Python进行比较. 使用这种方法,我们能够轻松确定两个图像是否相同或由于轻微的图像处理,压缩伪像或有 ...

  7. 第2章 数字之魅——快速寻找满足条件的两个数

    快速寻找满足条件的两个数 问题描述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在这样一组或以上符合要求的解. 分析与解法 [解法一] ...

  8. LeetCode:Find Peak Element - 寻找一个数组内的顶点

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Find Peak Element(寻找一个数组内的顶点) 2.题目地址 https://leetcode.co ...

  9. 学习逆向知识之用于游戏外挂的实现.第二讲,快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别...

    通过游戏外挂,学习逆向技术之快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别 一丶静态基址. 动态基址. 基址的区别 通过上一讲超级马里奥的游戏外挂技术制作.我们学习到了静态基址.以及观看内 ...

最新文章

  1. React+Redux开发实录(一)搭建工程脚手架
  2. 可视化深度学习模型的训练误差和验证误差
  3. Docker系列 二. Docker 安装 Nginx
  4. ERP实施需要一种态度
  5. pgsql的存储过程调用mysql_PostgreSQL存储过程循环调用方式
  6. wxWidgets:wxBitmap类用法
  7. 机器学习sklearn的快速使用--周振洋
  8. c++获取子类窗口句柄位置_干货分享:用一百行代码做一个C/C++表白小程序,程序员的浪漫!...
  9. java调用MySQL脚本_Java调用SQL脚本执行常用的方法示例
  10. iPhone 12主板曝光:布局更紧凑 满满苹果基因
  11. 800名员工被隔离,韩国半导体巨头紧急回应:工厂运营不受影响
  12. 卡尔曼滤波—建立状态空间表达式
  13. 矩池云上安装chumpy失败
  14. 【免费】某平台3980元大数据课程免费下载,仅此1次
  15. 工程项目利用AutoMake生成Makefile实战
  16. 中级软件评测师考什么
  17. 专业测评:5款热门的免费报表软件
  18. 高德地图根据经纬度获取详细地址
  19. 计算机型号win7,win7cpu型号怎么看
  20. 单位局域网连接的计算机太多,解决交换机端口不匹配导致局域网连接缓慢-ARP经验...

热门文章

  1. java class加载_Java 类加载
  2. 是不是顺子【C语言保姆级讲解】
  3. CCS问题:Texas Instruments XDS100v2 USB Emulator_0/C28xx : Target must be connected before loading prog
  4. html页面漏斗图,漏斗图的详细解读
  5. 数字工厂生产监控可视化决策平台,打造智能制造新时代
  6. 1718 Cos的多项式
  7. 秒杀springboot——未来轻量级高性能的Java云原生微服务框架来啦
  8. 十大老牌黑客之:米特尼克
  9. LCD(一) TFT液晶时序图
  10. 知领·报告 | 车路协同技术发展态势分析报告.md