C++ 给定正整数x和n,找出一个整数y,使得y^n最接近x,注意y^n可能小于、等于或者大于x。 输入描述 有多组测试数据,每组测试数据是由空格分隔的两个正整数x(1<=x<=1000000)和n(1<=n<=9),当x和n都为0时表示输入的结束。
时间: 2024-03-17 16:43:43 浏览: 91
好的,下面是 C++ 的代码实现:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
int main() {
while (true) {
int x, n;
cin >> x >> n;
if (x == 0 && n == 0) {
break;
}
// 二分查找
int left = 1, right = x;
while (left <= right) {
int mid = (left + right) / 2;
if (pow(mid, n) >= x) {
right = mid - 1;
} else {
left = mid + 1;
}
}
// 输出结果
if (pow(left, n) - x <= x - pow(right, n)) {
cout << left << endl;
} else {
cout << right << endl;
}
}
return 0;
}
```
希望能帮助到你!
相关问题
用c++写代码:给定正整数x和n,找出一个整数y,使得y^n最接近x,注意y^n可能小于、等于或者大于x。
以下是使用二分查找的C++代码实现:
```c++
#include <iostream>
using namespace std;
int main() {
int x, n;
cin >> x >> n;
int left = 1, right = x;
int ans = 1;
while (left <= right) {
int mid = left + (right - left) / 2;
long long pow_mid = 1;
for (int i = 1; i <= n; i++) {
pow_mid *= mid;
if (pow_mid > x) break;
}
if (pow_mid <= x) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
cout << ans << endl;
return 0;
}
```
首先输入x和n,然后初始化left为1,right为x,ans为1,表示y的初始值为1。然后进入二分查找循环,每次取mid=(left+right)/2,计算mid的n次方,如果mid^n小于等于x,则更新ans为mid,因为我们要找最接近x的y^n,所以ans要取最接近的。如果mid^n大于x,则说明y需要更小一些,所以right要更新为mid-1。最终循环结束后,ans即为最接近x的y的值。需要注意的是,计算mid^n时可能会溢出,所以需要使用long long类型。
给定一个正整数n,找出一个整数x,使得离2的x次方最接近,如果存在多个,则x尽可能小。写出C++代码
这个问题可以使用二分查找的方式来解决。首先我们需要找到2的最近的幂大于等于n,然后检查这个幂是否比n小,如果是,我们就减去这个幂,如果不是,我们就加上这个幂。以下是C++的实现代码:
```cpp
#include <iostream>
#include <cmath>
int closestPowerOfTwo(int n) {
if (n <= 0) return 0; // 对于负数和零,返回0
int x = 1;
while (x < n) {
x *= 2; // 逐步增大直到找到大于等于n的最小2的幂
}
// 检查是否需要调整
if (x > n) {
x /= 2; // 如果x过大,减半
}
return x;
}
int main() {
int num;
std::cout << "请输入一个正整数:";
std::cin >> num;
int result = closestPowerOfTwo(num);
std::cout << "与2的最近次方相等的整数是:" << result << std::endl;
阅读全文