我一直在研究将 n 写为 2 的幂和的方法,它工作得很好,但我想知道如何提高该算法的运行时效率。它无法在任何合理的时间内(不到 10 秒)计算超过 ~1000 的任何东西。
我假设它与将其分解为子问题有关,但不知道如何去做。我在想像 O(n) 或 O(nlogn) 运行时之类的东西——我相信它是有可能的。我只是不知道如何有效地分配工作。
通过 Chasefornone 编码
#include<iostream>
using namespace std;
int log2(int n)
{
int ret = 0;
while (n>>=1)
{
++ret;
}
return ret;
}
int power(int x,int y)
{
int ret=1,i=0;
while(i<y)
{
ret*=x;
i++;
}
return ret;
}
int getcount(int m,int k)
{
if(m==0)return 1;
if(k<0)return 0;
if(k==0)return 1;
if(m>=power(2,k))return getcount(m-power(2,k),k)+getcount(m,k-1);
else return getcount(m,k-1);
}
int main()
{
int m=0;
while(cin>>m)
{
int k=log2(m);
cout<<getcount(m,k)<<endl;
}
return 0;
}