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

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

相关推荐
Derek_Smart25 分钟前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
曲幽1 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
NE_STOP1 小时前
MyBatis-mybatis入门与增删改查
java
孟陬5 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌5 小时前
一站式了解四种限流算法
java·后端·go
华仔啊5 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
敏编程6 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪6 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
也些宝6 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java