在正整数中去掉所有的平方数(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需要调节


posted on 2011-11-13 21:51  Goal  阅读(254)  评论(0编辑  收藏  举报

导航