Java 实现求 n 的 n^n 次方的最后一位数字

在日常的编程练习中,我们经常会遇到求解大数幂次最后一位数字的问题。直接计算大数的幂次会导致数值溢出,因此需要借助数学规律来简化计算。本文将通过分析一段 Java 代码,讲解如何高效求解nn^n次方的最后一位数字。

问题分析

我们需要计算n^(n^n)的最后一位数字,核心难点在于n^n的数值会随着n增大急剧增长,直接计算不现实。因此我们需要利用模运算的性质循环规律来简化计算:

  1. 一个数的最后一位数字等价于该数对 10 取模的结果;
  2. 幂次的模运算存在周期性,可先对指数取模简化计算。

核心思路拆解

观察代码逻辑,整体分为两步:

  1. 计算指数n^n对 4 取模的结果(因为 10 的欧拉函数是 4,利用欧拉定理简化幂次);
  2. 用简化后的指数计算n^指数 % 10,得到最后一位数字。

步骤 1:简化指数(n^n mod 4)

由于我们最终要计算n^k %10(k = n^n),根据模运算性质,可先对指数 k 取模 4(特殊情况:若模 4 结果为 0,需将指数替换为 4)。代码中通过循环计算nums = (nums * n) %4,循环 n 次等价于计算n^n %4

步骤 2:计算最终结果(n^ 简化指数 %10)

用简化后的指数计算n的幂次对 10 取模,循环nums次计算res = (res *n) %10,最终得到最后一位数字。

完整代码解析

java 复制代码
package yjq20260204;

import java.util.Scanner;

/**
 * @author YJQ
 * @date 2026/2/7  19:20
 * @description 求n的n^n次方的最后一位数字
 */
public class main7 {
    public static void main(String[] args) {
        // 1. 创建Scanner对象接收用户输入
        Scanner scanner=new Scanner(System.in);
        // 2. 读取整数n
        int n=scanner.nextInt();
        
        // 3. 初始化变量:nums用于存储n^n mod4的结果,res存储最终结果
        int nums=1;
        int res=1;

        // 4. 计算n^n mod4
        for(int i=1;i<=n;i++)
        {
            nums=nums*n;   // 累乘n,模拟n^n
            nums=nums%4;   // 取模4,避免数值溢出
        }
        
        // 5. 特殊处理:若mod4结果为0,将指数替换为4(因为a^4 mod10有稳定规律)
        if(nums==0)
        {
           nums=4;
        }

        // 6. 计算n^nums mod10,得到最后一位数字
        for(int i=1;i<=nums;i++)
        {
            res=(res*n)%10;  // 累乘并取模10,始终保留最后一位
        }
        
        // 7. 输出结果
        System.out.println(res);
        
        // 8. 关闭Scanner(可选,避免资源泄漏)
        scanner.close();
    }
}

关键代码解释

  • 输入处理Scanner scanner = new Scanner(System.in) 接收用户输入的整数 n;
  • 指数简化 :第一个循环通过nums = (nums * n) %4 计算n^n mod4,避免大数运算;
  • 特殊值处理 :若nums=0,将其设为 4(例如 n=4 时,4^4=256,256 mod4=0,此时计算 4^4 mod10=6,与直接计算结果一致);
  • 最终计算 :第二个循环通过res = (res *n) %10 计算n^nums的最后一位数字。

测试案例

案例 1:n=2

  • 计算 n^n=2^2=4,4 mod4=0 → 替换为 4;
  • 计算 2^4=16,16 mod10=6;
  • 输出结果:6。

案例 2:n=3

  • 计算 3^3=27,27 mod4=3;
  • 计算 3^3=27,27 mod10=7;
  • 输出结果:7。

案例 3:n=4

  • 计算 4^4=256,256 mod4=0 → 替换为 4;
  • 计算 4^4=256,256 mod10=6;
  • 输出结果:6。

优化思路(拓展)

上述代码通过循环实现幂次计算,可进一步优化为数学公式直接计算,提升效率:

  1. 利用n^n mod4的数学规律,无需循环(例如偶数的平方 mod4=0,奇数的平方 mod4=1);
  2. 直接使用Math.pow结合模运算,但需注意整数溢出问题;
  3. 提取方法封装逻辑,增强代码复用性。

示例优化代码(简化指数计算):

java 复制代码
// 优化:直接计算n^n mod4,替代循环
if (n % 2 == 0) {
    nums = 0; // 偶数的n次方(n≥2)mod4=0
} else {
    nums = n % 4; // 奇数的n次方mod4=奇数本身mod4
}

总结

本文通过解析一段 Java 代码,讲解了求解n^(n^n)最后一位数字的核心思路:利用模运算简化指数,再通过循环计算最终结果。该方法避免了大数运算的溢出问题,核心是抓住 "幂次取模的周期性" 这一数学规律。

在实际开发中,遇到大数幂次取模问题时,都可以借鉴这种 "先简化指数,再分步取模" 的思路,既保证计算效率,又避免数值溢出。

相关推荐
生成论实验室18 小时前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法
风筝在晴天搁浅19 小时前
字节高频题 小于n的最大数
算法
LabVIEW开发19 小时前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
身如柳絮随风扬19 小时前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务
AI科技星19 小时前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅19 小时前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
gqk0119 小时前
【无标题】
python
王老师青少年编程19 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
Java小生不才19 小时前
Spring AI文生音
java·人工智能·spring
凯尔萨厮19 小时前
Springboot2.x+Thymeleaf项目创建
java