自己写一个求幂算法(c语言版)

前言

据说求幂算法和辗转相除法都可在密码学中得到应用。
接下来是自己写的一个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天,再发水文,呜呜呜别打……)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值