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

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

相关推荐
2301_818732063 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
园小异3 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653233 小时前
分布式系统安全通信
开发语言·c++·算法
2501_941982053 小时前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信
喵手3 小时前
Python爬虫实战:构建各地统计局数据发布板块的自动化索引爬虫(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集数据csv导出·采集各地统计局数据发布数据·统计局数据采集
马猴烧酒.4 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82184 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
alphaTao4 小时前
LeetCode 每日一题 2026/2/2-2026/2/8
算法·leetcode
sino爱学习4 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端