今天得空,想搞搞C语言里头那个乘方运算。平时可能顺手就用了,但今天就想琢磨琢磨,记一下自己是怎么弄的。
一开始嘛最直接的想法就是,C语言有没有现成的函数能直接算乘方?脑子里过了一下,好像有个叫 `pow()` 的函数,在 `math.h` 头文件里。这个函数挺强的,能算浮点数的,也能算整数的,比如 `pow(2.0, 3.0)` 就能算出 8.0。
于是我就试了试。先 `#include
但用着用着,我就感觉有点“重”。为啥?
- 这个 `pow()` 函数返回的是 `double` 类型,也就是双精度浮点数。如果我本来就是想算整数的乘方,比如 3 的 4 次方,结果是 81,它给我返回个 81.0,我可能还得再转回整数类型。
- 还得专门去包含 `math.h` 这个头文件。如果我的程序很简单,就为了这一个乘方运算,多加个头文件,感觉有点小题大做。
- 而且 `pow()` 函数内部实现可能考虑了各种复杂情况(比如负数、小数指数),对于我仅仅是算正整数次幂的简单场景,有点“杀鸡用牛刀”的感觉。
换个思路,自己动手试试
既然觉得 `pow()` 有点“重”,那我就想,能不能自己写个简单的?毕竟乘方的意思,就是把一个数自己乘自己好几次嘛
比如算 m 的 n 次方 (假设 n 是正整数),那不就是 m m m ... m,一共乘 n 次吗?
这个思路就很直接了,用个循环就能搞定。我就动手写了一下:
我先定义了一个函数,比如叫 `my_power`,接收两个整数参数:底数 `base` 和指数 `exponent`。
在函数里面,我弄了一个变量 `result`,先把它的值设成 1。这个很重要,因为任何数乘以 1 都等于它自己,可以作为累乘的起点。而且任何非零数的 0 次方都等于 1,这样指数 `exponent` 如果是 0,直接返回 1 就对了。
然后,我就用一个 `for` 循环,让它从 1 循环到 `exponent` 那么多次。
在循环体里面,就干一件事:让 `result` 乘以 `base`,再把新的结果存回 `result` 里。也就是 `result = result base;`。
等循环结束了,这个 `result` 里存的就是最终 `base` 的 `exponent` 次方的结果了。把 `result` 返回出去。
写完之后,我测试了几个例子,比如算 2 的 3 次方 (结果是 8),5 的 4 次方 (结果是 625),都没问题。对于指数是 0 的情况,比如 10 的 0 次方,也正确返回了 1。
这个自己写的循环版本,有几个好处:
- 代码很简单,逻辑清晰,就一个循环累乘。
- 不需要额外包含 `math.h` 头文件。
- 直接处理整数,返回整数,避免了浮点数转换可能带来的精度问题或者类型转换的麻烦。
我这个简单版本没考虑指数是负数的情况,也没对底数是 0、指数是 0 之类的特殊情况做特别细致的处理。但对于我当时那个场景,就是算个正整数次幂,完全够用了。
感觉挺好的,有时候不一定非要找现成的库函数,特别是这种基础运算,自己动手写一个简单的实现,反而更轻量、更直接。也算是又把基础的东西实践了一遍,加深了点印象。