目录
一、想法及见解
1.根据题目形式,有两个东西在变,底数和指数,所以我就想到了双重循环。
2.如果用python就不用顾虑定义变量时的内存占用情况,所以用c/c++时(尤其对于我还不太了解容器vector)要注意变量的大小。例如(1)a[100000] 是试出来的,(2)2<n<2^31,所以定义n的时候要大一点,同时指数部分也从这里得知循环次数,小于31。
3.flag的使用,本想着以flag的0,1来得知有无大幂数,但是忽略了会有多种情况的问题,91就有两个结果,所以就用flag>=1来判断,为什么是>=1?如果n有一种结果,这次循环找到了,而往后的循环没有了,flag便为0,就无法用flag==1来判断输出部分。
4.本人码龄不足一年,希望这些对你有所帮助,如果我有什么误解,请见谅。
二、代码实现
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
long long n = 0; // 定义变量 n 存储输入的正整数
int a[100000] = {0}; // 定义数组 a 存储从 1 到 100000 的自然数
int i = 0, j = 0, count = 0, m = 0; // 定义循环变量和计数器
int flag = 0; // 标志变量,用于标记是否找到符合条件的幂次和
// 初始化数组 a,使其存储从 1 到 100000 的自然数
for (i = 0; i < 100000; i++)
a[i] = i + 1;
cin >> n; // 读取输入的正整数 n
// 遍历幂次从 1 到 30
for (i = 1; i < 31; i++) // 次方
{
long long s = 0; // 定义变量 s 存储当前幂次和
// 遍历自然数序列
for (j = 0; j < n; j++)
{
s += pow(a[j], i); // 计算当前自然数的 i 次幂并累加到 s
if (s == n) // 如果当前幂次和等于 n
{
flag += 1; // 设置标志变量为 1 表示找到了一个解
count = j; // 记录最后一个使用的自然数的索引
m = i; // 记录当前幂次
break; // 跳出内层循环
}
if (s > n) // 如果当前幂次和大于 n
{
break; // 跳出内层循环
}
}
}
if (flag >= 1) // 如果找到了至少一个解
{
// 输出找到的幂次和表示形式
for (j = 0; j < count; j++)
{
cout << a[j]; // 输出当前自然数
cout << '^'; // 输出幂符号
cout << m; // 输出幂次
cout << '+'; // 输出加号
}
cout << a[count] << '^' << m; // 输出最后一个自然数及其幂次
}
else
{
cout << "Impossible for " << n << '.'; // 如果没有找到解,输出提示信息
}
return 0;
}
代码不一定是最简单的解法,如果您有令解,请留言,谢谢。