``# 自幂数的9位数查找之算法优化(C语言)

这是一篇C语言有关自幂数查找的优化过程,目前笔者最好结果是8位数用时7.007秒,9位数用时79.079秒。(水仙数是4位数自幂数)

期待有更棒的结果。

思维导图先上!!!

一,明确自幂数

1.什么是自幂数?

自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(水仙数是4位数自幂数)

(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数)

2.关键点。

1)幂数(自幂数的位数)

2)各底数(自幂数的每个位上的数)

3)一个数的幂次方

4)求和比较

二,一个数的幂次方

1.得到幂数

1)初步想法:

1.这个数除以10赋值给自己:

2.这个数为0,跳出循环。

3.这个数不为0,位长加1,执行第一步。

2)优化: 打破循环,直接用条件语句判断范围完成。

这里有一个很棒的优化点。

例如:一般都会从0开始。

但是,这样效率并不高,每次查找9位数都得先经过前面的1到8位数的判断,而先判断9位数会则减少时间,尤其1位数的个数少,全部经历8次判断次数的总次数远远少于9位数在底下的情况。如下:

wow,皮卡丘你好棒!!!

2.得到底数

这个简单,原数与10取余,保存余数,接着除以10,继续取余。

代码在后面附上.。嘤嘤嘤…

3.一个数的的幂次方

1)初步想法:

每一个位上的数做幂次方运算。

例如:153这个数, 求出1^3 , 5^3 , 3^3 , 而且不推荐用pow()函数,因为pow()可以运算1.25 6^5.632 这么复杂的数,其运算1^3时间 绝对比1* 1* 1要长。

这个代码就算了吧,可达鸭表示饿了。

2)优化:用空间换取时间

发现如果用for循环,在取得底数时直接做幂次方运算,例如这样

会很浪费时间,555596,这个数中5的6次方会做4次,其中后三次没有必要。

所以建立一个0~9的数字幂方表。很有用。

笔者提醒你,表格要写对。错了一数字,程序两行泪。

三,求和与比较

1)初步想法:

算出每一个数的幂次方求和后再比较。

上图:

2)优化: 1.未完成也可以比较

这时候聪明的你,肯定想到把if语句放进循环里,再给它来个啥break; 或者return;直接跳出循环。

等一等,似乎可以优化下。

你发现了大秘密,短路运算 !!恭喜你获得经验+1 。

四,使用

保佑保佑,快来保佑我。代码走起来,走起来。

失败…嘿嘿怎么不可能,少了一个;

磨人的小妖精!!继续。

忘了说一句使用time库,计时哦!!

最后,8位数用时7.007秒。

9位数用时79.079秒。

可以试试所有初步想法运行,也许你可以睡一会,让电脑加油。

完结散花☺☺☺

五,总结

笔者认为两个关键点:

1.空间换取时间

2.未完成与已完成。

一些小技巧的运用可以大大节省时间。

笔者斗胆认为,编程函数分而治之是做这个题目更重要的。

做好分析,手工过程,再上手,再优化。

编程有时也像画画。

感谢指导老师:铁血教主

笔者水平有限,目前只能描述以上问题,如果有其他情况,可以留言,有错误,请指教,有继续优化的,请分享,谢谢!

源码过段时间上传。

2019年11月26日 图书馆

#include #include const int singelNumPow[10][10] = {

//底数 0123456789

/*0*/1,1,1,1,1,1,1,1,1,1,

/*1*/0,1,2,3,4,5,6,7,8,9,

/*2*/ 0,1, 4, 9,16,25,36,49,64,81,

/*3*/ 0,1, 8, 27,64,125,216,49*7,64*8,81*9,

/*4*/ 0,1,16,81,64*4,125*5,216*6,49*7*7,64*8*8,81*9*9,

/*5*/ 0,1,32,81*3,64*4*4,125*5*5,216*6*6,49*7*7*7,64*8*8*8,81*9*9*9,

/*6*/ 0,1,32*2,81*3*3,64*4*4*4,125*5*5*5,216*6*6*6,49*7*7*7*7,64*8*8*8*8,81*9*9*9*9,

/*7*/ 0,1,32*2*2,81*3*3*3,64*4*4*4*4,125*5*5*5*5,216*6*6*6*6,49*7*7*7*7*7,64*8*8*8*8*8,81*9*9*9*9*9,

/*8*/ 0,1,32*2*2*2,81*3*3*3*3,64*4*4*4*4*4,125*5*5*5*5*5,216*6*6*6*6*6,49*7*7*7*7*7*7,64*8*8*8*8*8*8,81*9*9*9*9*9*9,

/*9*/ 0,1,32*2*2*2*2,81*3*3*3*3*3,64*4*4*4*4*4*4,125*5*5*5*5*5*5,216*6*6*6*6*6*6,49*7*7*7*7*7*7*7,64*8*8*8*8*8*8*8,81*9*9*9*9*9*9*9,

};

char isSelfNumber(int num);

int getpow(int n);

/*int singelNumPow(int singleNum, int n);

int singelNumPow(int singleNum, int n) {

}*/

int getpow(int num) {

if (num >= 100000000 && num < 1000000000)

return 9;

if (num >= 10000000 && num < 100000000)

return 8;

if (num >= 1000000 && num < 10000000)

return 7;

if (num >= 100000 && num < 1000000)

return 6;

if (num >= 10000 && num < 100000)

return 5;

if (num >= 1000 && num < 10000)

return 4;

if (num >= 100 && num < 1000)

return 3;

if (num >= 10 && num < 100)

return 2;

if (num >= 0 && num < 10)

return 1;

}

char isSelfNumber(int num) {

int oldNum;

int sum = 0;

int singleNum;

int n;

oldNum = num;

//取位数

n = getpow(num);

//获得每个位上的数

for(; sum <= oldNum && num ; num /= 10) {

singleNum = num % 10;

//sum += pow(singleNum, n);

sum += singelNumPow[n][singleNum];

}

return sum == oldNum;

}

int main() {

int Maxnum;

int ok;

int i;

long startTime;

long endTime;

printf("请输入最大数:");

scanf("%d",&Maxnum);

startTime = clock();

for ( i = 0; i < Maxnum ; i++) {

//遍历查找,成功返回

ok = isSelfNumber(i);

if (1 == ok) {

printf("%d\n",i);

}

}

endTime = clock();

endTime -= startTime;

endTime /= 1000;

printf("程序耗时:%ld.%03ld秒\n", endTime, endTime % 1000);

return 0;

}

c语言编程n位自幂数,自幂数9位数查找之算法优化(C语言)(水仙数是4位数自幂数)...相关推荐

  1. c语言编程64位,win-tc语言编程软件官方下载

    win-tc语言编程软件官方下载由西西为大家带来,win-tc是一款常见的编程工具,可以在W7 64位系统上完美运行,对于初学C语言的用户十分有帮助,软件体积小,下载后解压即可使用,无须安装,用法很简 ...

  2. c语言程序运行内存图解,从执行速度和内存使用等方面来优化C语言代码

    在本篇文章中,我收集了很多经验和方法.应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码. 简介 在最近的一个项目中,我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级 ...

  3. 四位数码管秒表 c语言编程,4位共阴极数码管秒表设计仿真与程序

    #include "reg51.h" #include "intrins.h" #define GPIO_DIG   P2                    ...

  4. 用C语言编程计算下列表达式:s=1! 2...,2012年全国计算机等级二级C语言模拟试题及答案(3)...

    一.单项选择题1. 设int x=1,y=1;表达式(!x++ || y--)的值是_________ A.0 B. 1 C. 2 D.-1 2.main( ) {  int n; ( n=6*4,n ...

  5. c语言编程实现基2-fft,时间抽选基2FFT及IFFT算法C语言实现

    /*时间抽选基2FFT及IFFT算法C语言实现*/ /*Author :Junyi Sun*/ /*Copyright 2004-2005*/ /*Mail:ccnusjy@yahoo.com.cn* ...

  6. c语言编程 三角波,周期矩形波、周期锯齿波、周期三角波,C语言程序.doc

    实用标准文案 精彩文档 周期矩形波的C语言代码 #include #include #include #include #define pi 3.1415926 #define E 2 #define ...

  7. c语言编程实现今日星期几,计算任何一天是星期几的C语言源代码.

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我们知道,公历的平年是365天,闰年是366天.置闰的方法是能被4整除的年份在2月加一天,但能被100整除的不闰,能被400整除的又闰.因此,像1600. ...

  8. c语言竞赛算法编程题目,[C语言编程接龙竞赛]第一题 设计一个N!的算法

    献丑了,贴上我的算法.. #include #include /* -- Program detail ----------- Programmer : yuki Last modify date: ...

  9. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

最新文章

  1. gcc 编译 java,编译lineage,gcc的版本问题
  2. LeetCode实战:只出现一次的数字
  3. seaborn clustermap详解及绘制
  4. 向Hadoop集群添加一个新的节点
  5. python输入hello*3_Python3基础(一) Hello World
  6. arduino nano 蓝牙_用Arduino玩转掌控板(ESP32):ESP32概述与Arduino软件准备
  7. HDOJ1907 SG问题
  8. YBTOJ:采矿战略(线段树维护dp、树链剖分)
  9. 子类可以继承到父类上的注解吗
  10. xcode windows版安装使用教程
  11. ASP.NET操作Excel(终极方法NPOI)
  12. Nginx+PHP-FPM优化技巧总结
  13. XP同步时间服务器地址
  14. HTML translate 属性
  15. 揭秘公共WiFi安全黑幕
  16. 09 conventional exercise
  17. 计算机配置扫盲,小白买电脑不知所措?最全的扫盲知识
  18. [置顶]Ceph源码解析:PG peering
  19. 论简历解析及其步骤(一)步骤及理论
  20. BZOJ1022 [SHOI2008]小约翰的游戏John

热门文章

  1. Halcon对彩色图像进行背景差法分割图像
  2. NC_Verilog中的工具ICC--转发
  3. iOS--SDWebImage源码
  4. 浙大计算机与科学学院,浙江大学计算机科学与技术学院导师介绍:高云君
  5. win7怎么更改计算机虚拟内存,小编教你win7虚拟内存怎么设置最好
  6. 旗舰对飙、高端死磕,2019下半年手机圈好看了
  7. SnowFlake权限概览
  8. kali伪装win10
  9. 2018android 最新技术,2018年还会有哪些手机技术创新呢?
  10. 超简单微信公众帐号自动回复和天气播报功能应用