![在这里插入图片描述 P1035 [NOIP2002 普及组] 级数求和_c++](https://s2.51cto.com/images/blog/202205/04004645_62715c755994d32990.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
简单至极。
//Author:PanDaoxi
using namespace std;
int main(){
double k,n=0.0,s=0.0;
cin>>k;
while(1){
s+=1/(++n);
if(s>k) break;
}
cout<<n;
return 0;
}
其他解法:(选自洛谷大神 Vel_ 的博客)
这是优化的程序。
以后可能会将回归性函数称为器,分类性函数称为灯。
using namespace std;
bool excess(double sn,double k){ //溢出灯
return sn > k;
}
int main(){
int i=1;
double sn=0,k;
cin>>k;
while(1){ //累加器
sn += (double)1/(double)(i++);
if(excess(sn,k)) {cout<<i-1;break;}
}
return 0;
}
数论优化 O(logk) O(logk)
https://www.luogu.org/problemnew/solution/P1035
exp(k)是指数调用的复杂度,最高可以优化到log(k)(相当多项式幂),因此最后得到的复杂度为O(logk)O(logk)。
值得指出的O(logk)O(logk)仅仅是理论的,因为最后cout打印的数的宽度已经是O(k)了!
运算虽然可以很快,却会被输出所限制。
using namespace std;
bool excess(double sn,double k){
return sn > k;
}
int main(){
int i=1;
double k;
while(cin>>k){
cout<<floor(exp(k-0.5772156649) + 0.5)<<endl;
}
return 0;
}
















