L1-111 大幂数(分数20)
题目描述
如果一个正整数可以表示为从 1 开始的连续自然数的非 0 幂次和,就称之为“大幂数”。例如 2025 就是一个大幂数,
因为2025 = \(1^3\) + \(2^3\) + \(3^3\) + \(4^3\) + \(5^3\) + \(6^3\) + \(7^3\) + \(8^3\) + \(9^3\) 。本题就请你判断一个数是否是大幂数;如果是,就按上面的格式输出幂数和。
同时,大幂数的表示不唯一,如果有多种,则输出幂最大的幂数和;
输入格式
输入一个正整数n(2 < n < \(2^{31}\))。
输出格式
如果是大幂数就输出:
1^k+2^k+...+m^k
否则输出
Impossible for n.
解题思路
用mx_mi记录最大幂,初始化为-1;
枚举每一个幂数,对于每一个幂数,从1开始加起,如果加的过程中恰好等于 n , 就保存下来 , 但是不break, 因为可能有更大的幂数符合要求;
关键结构
#include<iostream>
using namespace std;
//需要一个函数来计算幂数和中的每一项 , n 是底数 , k 是指数。尽量不要使用pow函数
long long solve(int n,int k)
{
long long base = 1;
for(int i = 1 ;i <= k; i++) base *= n;
return base;
}
int main()
{
int n;cin>>n;
int mx_mi = -1,mx_num=-1;
//接下来的结构需要理解并自行默写
for(int i = 1 ; i <= 31 ; i++ )
{
long long total = 0;
long long st = 1;
while(total <= n)
{
total += solve(st,i);
if(total == n)
{
mx_mi = i;
mx_num = st;
}
st++;
}
}
//这里是最深处了吗?
if(mx_mi != -1)
{
for(int i = 1 ; i <= mx_num;i++)
{
cout<<i<<"^"<<mx_mi;
if(i != mx_num) cout<<"+";
}
cout<<endl;
}
else cout<<"Impossible for "<<n<<"."<<endl;
return 0;
}

浙公网安备 33010602011771号