前言
据说求幂算法和辗转相除法都可在密码学中得到应用。
接下来是自己写的一个pow()算法。
注:假设输入的数据都是int 型。
代码
#include <stdio.h>
//本程序假定输入的数字数据类型为整型
bool Isodd(int n){
if(n%2==0) return true;
return false;
}
long int mypow(long int x,unsigned int n){
if(n==0)
return 1;
if(Isodd(n))
return mypow(x*x,n/2);
else return mypow(x*x,n/2)*x;
}
int main(){
int goal=mypow(2,3);
printf("%d",goal);
return 0;
}
程序首次编译后运行耗时 4.244s,多次直接运行后平均耗时0.014s。
(最后说句题外话:没有兴趣的小伙伴可以关掉页面了哈。
我也思考了一下,为什么会有这样的差别呢?
个人觉得跟我最近了解到的一个叫“缓存”的概念很有关系。
首先我们先了解一下c语言的编译机制
以hello.c文件为例
- 预处理:cpp根据以**#**开头的命令,修改原始的C程序。
比如 #include 了别的.h库,cpp就会将这些库中的内容直接插入程序文本中;
再比如#define ,cpp就会对代码的相应位置作替换处理。
经过这一阶段,得到了以 .i为后缀的文件,本质上仍是一个文本文件,只是具体内容相较于原始的.c文件有了一些变化。
- 编译:将高级语言形式转换为汇编语言的形式,文件后缀变为 .s 。详细过程可见**《编译原理》**
- 汇编:翻译成机器指令,并将指令打包成可重定位目标程序(relocatable object program)格式,并将结果保存在目标文件.o 中。hello.o为二进制文件。
- 链接:hello.c中所调用的库函数如printf在别的地方已经被预编译好,也是.o 的形式,这一步要做的就是将这些.o文件合并到整个hello.o中。
所以我觉得,如果每次直接执行都要这样转换一遍太麻烦了
不过因为我只是大概了解了缓存的概念,能找到的资料也说得过于高大上,我自己的概括能力又不强,所以暂时先挖个坑。
简单来说就是,系统先找个地方把这些放着,有需要就直接调用。这和统计一些实时信息时一般不调用数据库而用缓存类似。
(时隔n天,再发水文,呜呜呜别打……)