题目描述
牛牛选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过程中,牛牛会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum.
例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564.
牛牛现在给出一个sum,牛牛想让你求出一个正整数X经过上述过程的结果是sum.
输入描述:
输入包括正整数sum(1 ≤ sum ≤ 10^18)
输出描述:
输出一个正整数,即满足条件的X,如果没有这样的X,输出-1。
示例1
输入
564
输出
509
思路及解答
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
long sum = Long.parseLong(bf.readLine());
long res = solution(sum, 1, sum);
System.out.println(res);
}
/*
* 思路:
* 1.sum(1 ≤ sum ≤ 10^18),所以sum是long型,long的最大值为9 223 372 036 854 775 807
* 2.如果没有这样的x则输出-1
* 3.从1到sum找出这么一个数
* 4.因为这个数可能是个位数,所以这个数可能等于sum
* 5.找到中间的那个数
* (1)如果中间的那个数getSum(mid)==sum,则返回mid
* (2)如果中间的那个数getSum(mid) < sum,则到mid右边去寻找
* (3)如果中间的那个数getSum(mid) > sum,则到mid左边去寻找
* */
public static long solution(long sum, long low, long high){
while(low <= high){
long mid = (low + high) >> 1;
if(getSum(mid) == sum){
return mid;
}else if(getSum(mid) < sum){
low = mid + 1;
}else if(getSum(mid) > sum){
high = mid - 1;
}
}
return -1;
}
//输入n,输出sum,用这个sum来判断是不是等于给出的sum
public static long getSum(long n){
long sum = 0;
while(n != 0){
sum = sum + n;
n = n/10;
}
return sum;
}
}