XJOI1241等式的根

XJOI 1241怎么解啊
题目如下
题目描述:
有这样一个式子
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

#include <iostream>
using namespace std;
//获取十进制各位数字之和 
int S(int x){
    int sum=0;
    while(x){
        sum+=x%10;
        x/=10;
    }
    return sum;
}
int main(){
    int n;
    cin>>n;
    bool flag=false;//判断是否存在这样的数 
    int num;  //如果存在把结果存下来 
    for(int x=1;x<=n;x++){  //化简一下等式可知x肯定不大于n 
        if(x*x+S(x)*x==n){
            flag=true;
            num=x;
            break;
        }
    }
    if(flag){
        cout<<num;
    }
    else{
        cout<<-1;
    }
    return 0; 
}


#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
 
int main()
{
    long long n,x,s = 0;
    scanf("%lld",&n);
    for(long long i = max((long long)(1),(long long)(sqrt(n) - 81));i <= sqrt(n);i++)
    {
        x = i;
        s = 0;
        while(x > 0)
        {
            s += x % 10;
            x /= 10;
        }
        if(i * (i + s) == n)
        {
            printf("%lld",i);
            return 0;
        }
    }
    printf("-1");
    return 0;
}

你算一下
最终算到答案在sqrt(n) - 81 ~ sqrt(n)
再使用枚举法

求打赏

https://download.csdn.net/download/weixin_68756152/87759610