「アルゴリズムとデータ構造」コースでこの問題があります
式 x^2+s(x)+200·x=N があります。ここで、x と N は自然数で、S(x) は数値 x の桁数の合計です。
入力には、A≤B および A, B≤1,000,000,000 となる N および A, B があります。方程式を解く区間 [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();
}
}