我在“算法和数据结构”课程中遇到了这个问题
你有一个方程 x^2+s(x)+200·x=N,其中 x 和 N 是自然数,S(x) 是数字 x 的数字之和。
在输入上,我们有 N 和 A,B 使得 A≤B 和 A,B≤1,000,000,000。你需要检查在区间 [A, B] 中是否有一个自然数 x 来解方程。如果找到您需要返回该数字,否则返回 -1。
Example Input:
1456
10 80
Output
-1
我设法通过使用一些数学和一些修改版本的蛮力算法来解决这个问题。但是有没有更有效(基于算法)的方法来解决这个问题?
这是我的代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Range {
static int proveri(long N, long A, long B) {
long res = 0;
long start = (long)((-200 + Math.sqrt(4*N + 4))/2);
//System.out.println(start);
for (long i = Math.max(A, start); i <= B; i++) {
res = i * i + S(i) + 200 * i;
if(res == N)
return (int)i;
if(res > N)
return -1;
}
return -1;
}
static int S(long x) {
int sum = 0;
while(x > 0) {
sum += x % 10;
x /= 10;
}
return sum;
}
public static void main(String[] args) throws Exception {
int i,j,k;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long N = Long.parseLong(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
int res = proveri(N, A, B);
System.out.println(res);
br.close();
}
}