找自幂数的逐步优化算法
自幂数是指一个 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. 学习目标 每一个机器学习模型都有一个目标函数,而学习的目标,就是最小化目标函数.直观而言,当我们已经获得了一个函数,最小化该函数其实就是,在其自变量取值范围内,找到使得因变量最小的那个自变量取值 ...
- 深度学习中的优化算法之MBGD
之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...
- 【优秀作业】蚁群优化算法
蚁群优化算法 一.概述 生物学家发现,自然界中的蚁群觅食是一种群体性行为,并非单只蚂蚁自行寻找食物源.蚂蚁在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素.信息素浓度的 ...
- Dropout、梯度消失/爆炸、Adam优化算法,神经网络优化算法看这一篇就够了
作者 | mantch 来源 | 知乎 1. 训练误差和泛化误差 对于机器学习模型在训练数据集和测试数据集上的表现.如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时, ...
- 深度学习中的优化算法与实现
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 GiantPandaCV导语:这篇文章的内容主要是参考 沐神的mxnet/gluon视频中,Aston ...
- 【最全干货】从SGD到NadaMax,十种机器学习优化算法原理及实现
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者丨永远在你身后@知乎 来源丨https://zhuanlan.zhihu.com/p/81 ...
- 智能优化算法之蚁群算法(1)
蚁群算法(ant colony algorithm) : 一种模拟进化算法 蚂蚁在觅食过程中能够在其经过的路径留下一种称为信息素的物质,并在觅食的过程中能感知这种物质的强度,并指导自己的行动方向,他们 ...
- 【数据挖掘】数据挖掘算法 组件化思想 ( 模型或模式结构 | 数据挖掘任务 | 评分函数 | 搜索和优化算法 | 数据管理策略 )
文章目录 一. 数据挖掘算法组件化 二. 组件一 : 模型或模式结构 三. 组件二 : 数据挖掘任务 四. 组件三 : 评分函数 五. 组件四 : 搜索和优化算法 六. 组件五 : 数据管理策略 七. ...
最新文章
- 外联css及js的使用
- (正则表达式学习)正则表达式语法
- EXPORT_SYMBOL使用
- 第四周任务:wordCountPro
- ldpcMATLAB/ldpc的译码,matlab程序/LDPC编码的matlab实现/源码
- CAPL函数 Test Node中注册事件(TestJoin xxx)函数
- SIM900A更改波特率
- Linux傻瓜式安装k8s
- FileZilla Client ftp上传软件
- 【Novel AI】基于Koishi的QQ群配置AI绘图机器人方法
- ListView源码(推荐)
- 《人性的弱点》-[美]戴尔·卡耐基
- kubectl 命令详解(三十三):rollout resume
- 蓝牙通信的简要设计与开发(附加题)
- CSS:颜色、背景和剪切
- Spring @InitBinder注解
- Error Code: 1265. Data truncated for column
- 个人杀毒软件及防火墙排名
- 允许网站使用相机和麦克风_通过浏览器获取麦克风或相机等媒体的使用权限
- Mysql--day03