【题解】八次求和
【问题描述】
给定正整数 n, 求 1^8 + 2^8 +···+ n^8 mod 123456789 。其中 mod 表示取余。
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行,包含一个整数,表示答案。
【样例输入】
2
【样例输出】
257
【样例输入】
987654
【样例输出】
43636805
思路
方法一:
- 这种题目是大数求和,一般的数据类型会溢出,不能用。
- 用BigInteger来处理大数。
方法二:
- 使用位运算,快速求解。
【代码】
解法一:
import java.math.BigInteger;
import java.util.Scanner;
public class topic07 {
public static void main(String[] args) {
BigInteger begin; // 记录每次遍历的数,并对其未8次幂
BigInteger sum = BigInteger.ZERO; // 0 , 记录每次求和结果
System.out.print("请输入n:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 遍历求和
for (int i = 1; i <= n; i++) {
begin = BigInteger.valueOf(i).pow(8);// 对每个数未8次幂
sum = sum.add(begin); // 求和
}
String model = "123456789";
//对结果mod123465789并打印输出
System.out.println(sum.mod(new BigInteger(model)));
}
}
解法二:
import java.util.Scanner;
public class topic07_2 {
static long mod_number = 123456789;//题目要求
public static void main(String[] args) {
System.out.print("请输入一个数:");
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long sum = 0; // 记录所求的数
for (long i = 1; i <= n; i++) {
sum = (sum + quickPow(i, 8)) % mod_number;
}
System.out.println(sum);
}
// 快速求幂
static long quickPow(long n, long pow) {
long sum = 1;
while (pow > 0) {
// 结果赋值条件。
if ((pow & 1) == 1) {
sum = (sum * n) % mod_number;
}
n = (n * n) % mod_number;
pow >>= 1;//移位运算
}
return sum; // 返回幂运算结果
}
}
结果
43636805
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?