第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\n", 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; }