题目解析
判断给定的数,是否为大幂数
- 如果是大幂数,则输出幂次最大的那个和
- 如果不是大幂数,则输出
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);
}