我试图解决以下问题:对于给定的n和α,确定最小数k,其中n可以表示为k个数之和,每个数是一个完美的α次幂。
我的第一个想法是创建一个长度为n的序列,然后使用递归来创建具有完美α次幂的每个可能序列。在创建序列后,我将检查序列中所有数字的总和是否总和为n,然后检查数字的总数是否小于k,如果这些数字都为真,那么我将更新k。我写了一个解决大多数情况的程序,但由于某种原因没有创建所有可能的顺序。例如,如果用户输入92为n,3为α,则k应为3,因为4 ^ 3 + 3 ^ 3 + 1 ^ 3 = 92,但我的程序返回k = 92。
#include<iostream>
#include<cmath>
void check(const int &N, const int &A, int *pSeq, int position, int &K){
int sum=0;
int total=0;
for(int i=0; i<N; ++i){
sum+=pSeq[i];
if(pSeq[i]>0){
++total;
}
}
if(sum==N){
if(total < k){
K=total;
std::cout<<"Print seq: ";
for(int i =0; i<N; ++i){
std::cout<<pSeq[i] <<" ";
}
std::cout<<std::endl;
}
}
if(sum<N){
if(position < N){
for(int i=0; pow(i, A)<N+1; ++i){
pSeq[position]=pow(i, A);
check(N, A, pSeq, position+1, K);
}
}
}
}
int main(){
int n, a;
std::cout<<"Enter n and a: ";
std::cin>>n >>a;
int k=n;
int *sequence=new int[n];
for(int i=0; i<n; ++i){
sequence[i]=0;
}
check(n, a, sequence, 0, k);
std::cout<<"k=" <<k <<std::endl;
return 0;
}
答案 0 :(得分:1)
好的,你没有任何反馈意见。让我们举个例子:循环使数组... 0 0 64 64然后它们去... 0 1 64 64等但是64 + 64 = 128&gt; 92.所以我们需要最后一个循环来降低功率并考虑...... 0 1 27 64,这就是答案。我添加了这些&#34;反馈&#34;你的代码。
#include<iostream>
#include<cmath>
int k = 99999;
void check(const int &N, const int &A, int *pSeq, int position, int &K,bool& too_big,bool& ready){
if (ready)
return;
int sum=0;
int total=0;
for(int i=0; i<N; ++i){
sum+=pSeq[i];
if(pSeq[i]>0){
++total;
}
}
if(sum==N){
if(total < k){
K=total;
std::cout<<"Print seq: ";
for(int i =0; i<N; ++i){
std::cout<<pSeq[i] <<" ";
}
std::cout<<std::endl;
ready = true;
return;
}
}
if(sum<N){
if(position < N){
for(int i=0; pow(i, A)<N+1; ++i){
pSeq[position]=pow(i, A);
check(N, A, pSeq, position+1, K,too_big,ready);
if (too_big) {
too_big = false;
pSeq[position]=pow(i-1, A);
return;
}
}
}
}
else
too_big = true;
}
int main(){
int n, a;
std::cout<<"Enter n and a: ";
std::cin>>n >>a;
int k=n;
int *sequence=new int[n];
for(int i=0; i<n; ++i){
sequence[i]=0;
}
bool too_big = false,ready = false;
check(n, a, sequence, 0, k,too_big,ready);
std::cout<<"k=" <<k <<std::endl;
return 0;
}
答案是
Print seq: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 27 64
k=3