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;

}
posted @ 2026-03-13 21:22  shuiwangrenjia  阅读(2)  评论(0)    收藏  举报