L1-111 大幂数 - java

题目解析

判断给定的数,是否为大幂数

  • 如果是大幂数,则输出幂次最大的那个和
  • 如果不是大幂数,则输出Impossible for n.

解题思路

使用枚举的方法来判断给定的数是否为大幂数

代码

import java.io.*;

public class Main
{
	static long n;
	
	// 快速幂
	static long quick_pow(int a, int b)
	{
		long mul = 1;
		while (b > 0)
		{
			if (b % 2 == 1) mul = mul * a;
			a = a * a;
			b >>= 1;
		}
		return mul;
	}

	// 判断当前这个数是否可以以k次幂的数组合
	static boolean check(int k)
	{
		long ans = 0;
		for (int i = 1; ans < n; i++) ans += quick_pow(i, k);
		return ans == n;
	}

	public static void main(String[] args)
	{
		n = sc.nextLong();
		int k = -1;
		// 枚举1到31次幂。由于给定的数小于2^31,但是可能会出现31次之间的数之和
		for (int i = 1; i <= 31; i++)
		{
			// 如果能组成以i次幂,则记录到k当中
			if (check(i)) k = i;
		}

		// 如果没有找到
		if (k == -1) out.println("Impossible for " + n + ".");
		else
		{
			// 输出最大幂次的大幂数
			long ans = 0;
			for (int i = 1; ans < n; i++)
			{
				ans += quick_pow(i, k);
				out.print(i + "^" + k);
				if (ans != n) out.print("+");
			}
		}

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);
}

快速幂


团体程序设计天梯赛-练习集-java

赞赏