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)最后一位数字的核心思路:利用模运算简化指数,再通过循环计算最终结果。该方法避免了大数运算的溢出问题,核心是抓住 "幂次取模的周期性" 这一数学规律。

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

相关推荐
花酒锄作田1 小时前
[python]argparse 包在聊天机器人中的应用
python
ps酷教程3 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云3 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
小羊在睡觉4 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
3DVisionary4 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
AI玫瑰助手4 小时前
Python函数:默认参数的定义与注意事项
开发语言·python·信息可视化
好评笔记4 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466854 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
小糖学代码4 小时前
LLM系列:环境搭建:5.Python-dotenv 环境变量管理
人工智能·python·深度学习·神经网络
_日拱一卒4 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先