• 第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;
    }
  • 相关阅读:
    基本sql查询语句练习
    SZU:J38 Number Base Conversion
    SZU:B54 Dual Palindromes
    SZU:A66 Plastic Digits
    HOJ:2031 进制转换
    SZU:G34 Love code
    SZU:A25 Favorite Number
    Vijos:P1001谁拿了最多奖学金
    SZU:A26 Anagram
    SZU:A12 Jumping up and down
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/11370507.html
Copyright © 2020-2023  润新知