有这样一个式子 x2+S(x)∗x−n=0 x,n都是正整数, S(x)为x所有十进制数位的和 现在给你一个n,你需要找到最小的x使得等式成立。 输入格式: 输入一个整数n 输出格式: 输出一个整数 如果不存在一个整数使得等式成立,输出-1 样例输入1: 110 样例输出1: 10 样例输入2: 4 样例输出2: -1 约定: 1<=n<=1018 c++代码 用二分
时间: 2024-04-17 10:26:39 浏览: 106
大于1 的正整数n可以分解为:n=x1*x2*…*xm。
5星 · 资源好评率100%
对于给定的n,我们需要找到一个正整数x,使得x的平方加上x的十进制数位和的乘积等于n。
为了优化查找过程,我们可以使用二分搜索来确定最小的x。
具体的算法如下:
1. 初始化变量left为1,变量right为n。
2. 当left小于等于right时,执行以下步骤:
a. 计算中间值mid为(left + right) / 2。
b. 计算mid的平方加上mid的十进制数位和的乘积,记为sum。
c. 如果sum等于n,找到符合条件的x,输出mid并结束。
d. 如果sum大于n,更新right为mid - 1。
e. 如果sum小于n,更新left为mid + 1。
3. 如果没有找到符合条件的x,输出-1。
下面是使用C++实现的代码:
```cpp
#include <iostream>
using namespace std;
int digitSum(int x) {
int sum = 0;
while (x > 0) {
sum += x % 10;
x /= 10;
}
return sum;
}
int main() {
long long n;
cin >> n;
long long left = 1;
long long right = n;
long long result = -1;
while (left <= right) {
long long mid = (left + right) / 2;
long long sum = mid * mid + digitSum(mid) * mid;
if (sum == n) {
result = mid;
break;
} else if (sum > n) {
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << result << endl;
return 0;
}
```
注意:根据题目要求,n的范围是1到1018,因此我们需要使用long long类型来存储n和结果。另外,为了计算x的十进制数位和,我们定义了一个辅助函数digitSum。
阅读全文