題面
題意
給定一個方程,求出 x 的最小正整數解,如果不存在,則輸出 -1 。
解題思路
注意到題目中的 n 的最大值是
注意 s(x) 函數,可以發現 s(x) 在 x 取得最大值,即 x = 999999999 時相應地取得最大值,即 81。於是,我們可以去枚舉 s(x) ,計算相應的 x 能否使方程左右兩邊相等,這樣就能大大降低複雜度。我們將原方程化爲左邊是 x 的方程:
這樣,我們只需要從 1 到 81 枚舉所有 s(x),計算出相應的 x,代入方程比較是否相等即可。
參考代碼
#include <cstdio>
#include <cmath>
using namespace std;
// s(x) 函數
int s(long long x) {
int sum = 0;
while(x) {
sum += x%10;
x /= 10;
}
return sum;
}
int main(int argc, char const *argv[]) {
long long n, ans = -1;
scanf("%lld", &n);
for(int i=1; i<=81; ++i) {
long long x = sqrt(i*i/4+n) - i/2;
int sx = s(x);
if(x*x+sx*x-n == 0) {
ans = x;
break;
}
}
printf("%lld\n", ans);
return 0;
}