第k个非立方数(忘记哪里的题了)

教训惨重

题意就是给t(t<=5000)组数据,每组数据给定一个数k(0<=k<=1e18),求第k个不是立方数的数。

1e18开三次方是1e6,数据不大,1e18+1e6在long long的范围内,然后通过思考得到思路,第k个不是立方数的数=k+[(k)1/3 ];“ [ ]取整 ”。

就这样就可以做了。

“这段是我的失误,需要看代码的再下面,这里跳过即可”

总结一下我的错误:

1.没有注意到int和float(double)的优先级顺序, 其中优先级double>float>int。。

2.为了省事我用了pow(k,1.0/3)求了k的开立方数,但是pow返回的是double型的,我把double和long long加在一起,因为优先级的原因,和是double型的,

还有,浮点数的等号判断和int型的不一样,因为浮点数是不精确的,所以一个浮点数减去一个整数不能直接和0比较是否相等。(所以可以自己写一个pow函数)

下面是正确的代码

#include<iostream>
using namespace std;

long long mypow(long long k)
{
    long long a = 1;
    for (a;; a++)
    {
        if (a*a*a < k)
            continue;
        if (a*a*a == k)
            return a;
        if (a*a*a > k)
        {        
            return a-1 ;
        }
    }
}

int main()
{
    int t;
    cin >> t;
    long long p;
    while (t--)
    {
        long long k;
        cin >> k;
        long long ans;
        
        p = mypow(k);
        ans = k + p ;
        if (mypow(ans)*mypow(ans)*mypow(ans)==ans)  //这里判断一下找到的数字是否是立方数,若是+1;
ans += 1; printf("%lld
", ans); cout << p; } getchar(); getchar(); return 0; }

下面是暴力一点的方法,不知道会不会超时。。

这里也有过一个错误:

在mylifang()函数中,我想q<=1e6,所以可以用int来存储,但是,,错了,,原因:int*int*int结果还是int,,所以会溢出,就错啦。。
#include<iostream>
using namespace std;

long long f[1000002];
int len = 1000000;

void mylifang()
{
    for (long long q = 1; q <= 1000000; q++)  //这里q之前定义成了int,所以错了
    {
        f[q] = q * q*q;
    }
}

int binary_search(long long a[], long long x)
{

    //折半查找默认数组已经排序
    int low = 1, high = len;
    while (low < high)
    {
        int mid = (low + high) / 2;
        if (a[mid] < x)
            low = mid + 1;
        else if (a[mid] > x)
            high = mid - 1;
        else
            return mid;
    }
    return -1;
}

long long binary_up_bound(long long a[], int low, int high, long long key)
{
    while (low < high) 
    {
        int mid = (low + high + 1) / 2;
        if (a[mid] > key) 
        {
            high = mid - 1;
        }
        else 
        {    //a[mid] <= key
            low = mid;
        }
    }
    if (a[low] <= key)
    {
        return low;
    }
    else 
    {
        return -1;
    }
}


int main()
{
    int t;
    cin >> t;
    mylifang();
    while (t--)
    {
        long long a;
        cin >> a;
        //二分查找a的位置
        long long m= binary_up_bound(f,1,1000000 ,a);
        cout << m << endl;
        
        long long ans = a+m;
        //int k = binary_search(f, ans);
        if (f[m + 1] == ans)   //这里判断一下找到的数字是否是立方数,若是+1;
            ans = ans + 1;
        cout << ans << endl;

    }
    getchar();
    getchar();
    return 0;
}
原文地址:https://www.cnblogs.com/yz-lucky77/p/11370507.html