有如下方程:
x2 + s(x)·x - n = 0,
其中x, n是正整数, s(x) 是函数, 等于十进制数中x 的位数之和.
明明有一个整数 n, 请你帮明明找到方程x最小的正整数根,或者确定没有这样的根.
Input
第一行包含整数n (1 ≤ n ≤ 1018),是方程参数
请不要使用%lld 读入. 推荐使用 cin, cout 流或 %I64d
Output
输出 -1,如果方程没有正整数根. 否则输出这个最小的正整数根 x (x > 0)
Example
Input
2
Output
1
Input
110
Output
10
Input
4
Output
-1
Note
在样例x = 1 是最小的根. 因为 s(1) = 1 并且 12 + 1·1 - 2 = 0.
在样例二 x = 10 是最小的根. 因为 s(10) = 1 + 0 = 1 并且 102 + 1·10 - 110 = 0.
在样例三中方程没有根.
本代码主要是会用__int64,和配方求x,此外用1-81,循环求s(x),重要思路。
#include <stdio.h>
#include <math.h>
using namespace std;
int main()
{
__int64 n,ch=-1,m;
int s,i;
scanf("%I64d",&n);
for(int j=1;j<=81;++j)
{
s=0;
m=sqrt(j*j/4+n)-j/2;
i=m;
while(i)
{
s=s+i%10;i=i/10;
}
if(m*m+m*s-n==0)
{
ch=m;
break;
}
}
printf("%I64d\n",ch);
return 0;
}
/*中文名称
int64
类 型
符号 64 位整数数据类型
控 制
值类型的字符串表示形式的信息
分 别
long long 与 unsigned
用处
Pascal、C、C++等1、int64不能用作为循环变量
2、int64的操作速度较慢*/