自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数)

自幂数包括:独身数、水仙花数、四叶玫瑰数、五角星数、六合数、北斗七星数、八仙数、九九重阳数、十全十美数 。
下面分析怎样找出自幂数的算法:
1:首先要能判断一个自幂数
(这里面可以分为几个函数
1.找出数字的位数
2.给一个算次方的函数)
2:给定范围,查找自幂数
说到这里有的小朋友可能特别疑惑了,为神魔要自造一个算次方的函数呢?
C语言的math.h库里面不是有pow()函数直接调用吗?
请注意本文章的标题,我们要优化,优化,优化,我们要给一个更快的方法,嘿哈。
先给出我第一次写出来的代码

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



程序运行到这里,已经卡住了,头疼,头疼,这种算法可能
我们分析一下,计算长度能不能不用循环呢,我们这样想,可以定一个a[10]数组,a[0]为0,a[1]为10,a[2]为100,若最大范围数组小于a[i-1]大于a[i]则位数为i,这样不用循环,节省了时间,就很简单的判断了数字的位数!
我们再来看一下我们的,程序优化后的速度;

可是他还不够快,我还想更快!!!!!
我们直接给出一个二维数组,将数字的1到10次方的数值存到一个数组里面。
这样直接在数组里面找,不用再来循环叠加,再乘计算!

这样我们来看看最终的运行耗时!

我们在最后来给出最后完全的代码!

#include <stdio.h>
#include <time.h>#include "./include/mec.h"const int powValue[][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 intPow(int a, int p);int intPow(int a, int p) {return powValue[p][a];
}int intLen(int num) {if (num < 0) {return 0;}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;}return 1;
}boolean isSelfPower(int num) {int cnt;int sum;int n;cnt = intLen(num);sum = 0;for (n = num; n && sum <= num; n /= 10) {sum += intPow(n % 10 ,cnt);}return sum == num;
}int main() {int num;int maxNum;long startTime;long endTime;long deltaTime;printf("输入最大范围:");scanf("%d", &maxNum);startTime = clock();for (num = 0; num < maxNum; num++) {if (isSelfPower(num)) {printf("%d是自幂数\n", num);}}endTime = clock();deltaTime = endTime - startTime;printf("耗时:%ld.%03lds\n", deltaTime / CLOCKS_PER_SEC, deltaTime % CLOCKS_PER_SEC);return 0;
}/*int intLen(int num) {int cnt = 0;if (num <= 0) {return 1;}while (num) {cnt++;num /= 10;}return cnt;
}
*/
/*
int intPow(int a, int p) {int sum = 1;int i;for (i = 0; i < p; i++) {sum *= a;}return sum;
}
*/

嘿嘿,这样就结束啦,如果你们能给出一个更加快速,时间复杂度更低的算法呢,欢迎留言,讨论,互相关注
后面还会提一些比较有意思的算法哦!!!

找自幂数的逐步优化算法相关推荐

  1. 深度学习中的梯度下降优化算法综述

    1 简介 梯度下降算法是最常用的神经网络优化算法.常见的深度学习库也都包含了多种算法进行梯度下降的优化.但是,一般情况下,大家都是把梯度下降系列算法当作是一个用于进行优化的黑盒子,不了解它们的优势和劣 ...

  2. 机器学习最常用的优化算法 — 梯度下降法

    1. 学习目标 每一个机器学习模型都有一个目标函数,而学习的目标,就是最小化目标函数.直观而言,当我们已经获得了一个函数,最小化该函数其实就是,在其自变量取值范围内,找到使得因变量最小的那个自变量取值 ...

  3. 深度学习中的优化算法之MBGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

  4. 【优秀作业】蚁群优化算法

    蚁群优化算法 一.概述 生物学家发现,自然界中的蚁群觅食是一种群体性行为,并非单只蚂蚁自行寻找食物源.蚂蚁在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素.信息素浓度的 ...

  5. Dropout、梯度消失/爆炸、Adam优化算法,神经网络优化算法看这一篇就够了

    作者 | mantch 来源 | 知乎 1. 训练误差和泛化误差 对于机器学习模型在训练数据集和测试数据集上的表现.如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时, ...

  6. 深度学习中的优化算法与实现

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 GiantPandaCV导语:这篇文章的内容主要是参考 沐神的mxnet/gluon视频中,Aston ...

  7. 【最全干货】从SGD到NadaMax,十种机器学习优化算法原理及实现

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者丨永远在你身后@知乎 来源丨https://zhuanlan.zhihu.com/p/81 ...

  8. 智能优化算法之蚁群算法(1)

    蚁群算法(ant colony algorithm) : 一种模拟进化算法 蚂蚁在觅食过程中能够在其经过的路径留下一种称为信息素的物质,并在觅食的过程中能感知这种物质的强度,并指导自己的行动方向,他们 ...

  9. 【数据挖掘】数据挖掘算法 组件化思想 ( 模型或模式结构 | 数据挖掘任务 | 评分函数 | 搜索和优化算法 | 数据管理策略 )

    文章目录 一. 数据挖掘算法组件化 二. 组件一 : 模型或模式结构 三. 组件二 : 数据挖掘任务 四. 组件三 : 评分函数 五. 组件四 : 搜索和优化算法 六. 组件五 : 数据管理策略 七. ...

最新文章

  1. 外联css及js的使用
  2. (正则表达式学习)正则表达式语法
  3. EXPORT_SYMBOL使用
  4. 第四周任务:wordCountPro
  5. ldpcMATLAB/ldpc的译码,matlab程序/LDPC编码的matlab实现/源码
  6. CAPL函数 Test Node中注册事件(TestJoin xxx)函数
  7. SIM900A更改波特率
  8. Linux傻瓜式安装k8s
  9. FileZilla Client ftp上传软件
  10. 【Novel AI】基于Koishi的QQ群配置AI绘图机器人方法
  11. ListView源码(推荐)
  12. 《人性的弱点》-[美]戴尔·卡耐基
  13. kubectl 命令详解(三十三):rollout resume
  14. 蓝牙通信的简要设计与开发(附加题)
  15. CSS:颜色、背景和剪切
  16. Spring @InitBinder注解
  17. Error Code: 1265. Data truncated for column
  18. 个人杀毒软件及防火墙排名
  19. 允许网站使用相机和麦克风_通过浏览器获取麦克风或相机等媒体的使用权限
  20. Mysql--day03

热门文章

  1. ppt文件太大如何压缩变小?
  2. YOLOv5+TensorRT+Win11(Python版)
  3. Python 人脸抓拍
  4. 若依框架修改器(包名修改器) 修改不全问题
  5. win10 桌面体验 服务器,windows server 2012 R2 安装桌面体验
  6. JAVA工程师个人简历中的项目经验范文
  7. win10如何安装mysql_win10安装mysql详细步骤
  8. Windows触控手势
  9. Shell脚本速查手册
  10. 续 Codeforces 596 C Wilbur and Points