简单至极。
#include <iostream>
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_ 的博客) 这是优化的程序。
以后可能会将回归性函数称为器,分类性函数称为灯。
#include<bits/stdc++.h>
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:
exp(k)是指数调用的复杂度,最高可以优化到log(k)(相当多项式幂),因此最后得到的复杂度为O(logk)O(logk)。
值得指出的O(logk)O(logk)仅仅是理论的,因为最后cout打印的数的宽度已经是O(k)了!
运算虽然可以很快,却会被输出所限制。
#include<bits/stdc++.h>
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;
}
|