【题解】八次求和
【问题描述】
给定正整数 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

浙公网安备 33010602011771号