在正整数中去掉所有的平方数(1,4,9,……),然后输入一个n,求第n个位置上的数
/*在正整数中去掉所有的平方数(1,4,9,……),然后输入一个n,求第n个位置上的数*/
别人的算法:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int m=1;//m代表当前应该去掉的数是m*m(在n以内)
while(m*m<=n)
{
int s=(int)sqrt(n*1.0);
n+=s-m+1;
m=s+1;
}
cout<<n<<endl;
}
return 0;
}
//算法时间复杂度O(logn),优点是快,但不太好理解
我的想的算法,是用的二分:对于一个为n的数,当去掉n以内的平方数,他排第(n-(int)log(n*1.0))
#include <iostream>
#include <cmath>
using namespace std;
const int Max=100000000;
int main()
{
int n;
while(cin>>n)
{
int l=1,r=Max,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
int rank=mid-(int)sqrt(mid*1.0);
if(rank==n)
{
cout<<mid<<endl; break;
}
else if(rank<n)
l=mid+1;
else
r=mid-1;
}
// cout<ans<<endl;
}
return 0;
}
缺点是对于Max需要调节