C语言之求任意次方的最后三位
时间:2024-04-02 14:10:43 来源:网络cs 作者:胡椒 栏目:数据分析 阅读:
目录
一 简介
二代码实现
三 时空复杂度
一 简介
在C语言中,求一个整数任意次方的最后三位数可以使用快速幂算法结合取模运算来实现。
二代码实现
#include <stdio.h>// 使用快速幂算法计算 x 的 y 次方对 1000 取模的结果int lastThreeDigits(int x, int y) { int result = 1; int base = x % 1000; // 先将x取模以确保结果始终是最后三位 while (y > 0) { if (y % 2 == 1) { // 如果y为奇数,则乘以当前base result = (result * base) % 1000; } y /= 2; // 将y减半 base = (base * base) % 1000; // 并且平方base值并取模 } return result;}int main() { int num, power; printf("请输入底数:"); scanf("%d", &num); printf("请输入指数:"); scanf("%d", &power); int last_digits = lastThreeDigits(num, power); printf("底数 %d 的 %d 次方的最后三位数字是:%d\n", num, power, last_digits); return 0;}
该代码首先通过取模操作将输入的底数x
限制在最后三位以内,然后利用快速幂算法(这里采用的是二进制分解优化)逐步计算出x
的y
次方对1000取模后的结果。这样得到的就是最后三位数。每次循环中,先判断指数是否为奇数决定是否需要与结果相乘,然后再将指数和底数同时进行除2和平方的操作,并始终保持在对1000取模的状态下。最后返回的结果即为所求的最后三位数。
三 时空复杂度
时间复杂度和空间复杂度分析:
时间复杂度: 这段代码中,lastThreeDigits
函数采用了快速幂算法,该算法的时间复杂度通常表示为O(log y)。在每次循环中,我们通过将指数y不断除以2来减小其大小,直到y变为0为止。因此,循环的次数大致等于输入指数y的二进制位数。对于任意整数y,其二进制位数不会超过,所以整个函数的时间复杂度为。
空间复杂度:
函数内部使用的变量包括result
、base
和y
,这些都在栈上分配,无论输入的指数y如何变化,所需的空间都是固定的。在main
函数中,用于存储用户输入的num
和power
也占用固定的空间。 综上所述,这段代码的时间复杂度为,空间复杂度为O(1)(常数空间)。
本文链接:https://www.kjpai.cn/news/2024-04-02/152675.html,文章来源:网络cs,作者:胡椒,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:【vue2】对路由的理解
下一篇:返回列表