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)
再使用枚举法
求打赏