C语言之求任意次方的最后三位

目录

一 简介

二代码实现

三 时空复杂度


一 简介

在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限制在最后三位以内,然后利用快速幂算法(这里采用的是二进制分解优化)逐步计算出xy次方对1000取模后的结果。这样得到的就是最后三位数。每次循环中,先判断指数是否为奇数决定是否需要与结果相乘,然后再将指数和底数同时进行除2和平方的操作,并始终保持在对1000取模的状态下。最后返回的结果即为所求的最后三位数。

三 时空复杂度

时间复杂度和空间复杂度分析:

  1. 时间复杂度: 这段代码中,lastThreeDigits函数采用了快速幂算法,该算法的时间复杂度通常表示为O(log y)。在每次循环中,我们通过将指数y不断除以2来减小其大小,直到y变为0为止。因此,循环的次数大致等于输入指数y的二进制位数。对于任意整数y,其二进制位数不会超过log_2y+1,所以整个函数的时间复杂度为O(log_2y)

  2. 空间复杂度:

    • 函数内部使用的变量包括resultbasey,这些都在栈上分配,无论输入的指数y如何变化,所需的空间都是固定的。
    • main函数中,用于存储用户输入的numpower也占用固定的空间。

综上所述,这段代码的时间复杂度为O(log_2y),空间复杂度为O(1)(常数空间)。

  • 52
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值