爱奇艺 最后一位 数学

题目描述

牛牛选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过程中,牛牛会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum.
例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564.
牛牛现在给出一个sum,牛牛想让你求出一个正整数X经过上述过程的结果是sum.

输入描述:

输入包括正整数sum(1 ≤ sum ≤ 10^18)

输出描述:

输出一个正整数,即满足条件的X,如果没有这样的X,输出-1。

示例1

输入

564

输出

509
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long int
ll maxn = 1e18+5;
ll bsearch(ll left,ll ri,ll num);
ll judge(ll i,ll num);
int main()
{
    ll num;
    while(cin>>num)
    {
        if(bsearch(0,maxn,num)==-2)
        {
            cout<<"-1"<<endl;
        }else cout<<bsearch(0,maxn,num)<<endl;        
    }
    return 0;
}
ll bsearch(ll left,ll ri,ll num)
{
    while (left <= ri)
    {
        ll mid = (left + ri)/2;
        //cout<<mid<<"mid值"<<endl;
        if(judge(mid,num)==-1) left = mid+1;
        else if(judge(mid,num)==1)
        {
            ri=mid-1;
        }else 
        {
            return mid;        
        }
    }
    return -2;
}
ll judge(ll i,ll num)        //i 为检验的值,num 为 
{
    ll a=i;
    ll b=a;
    //cout<<i<<"i值"<<endl;
    //cout<<a<<"a值"<<endl;
    while(a)
    {
        a/=10;
        b+=a;        
    }
    //cout<<b<<endl;
    if(b>num)
    {
        return 1;
    }else if(b==num)
    {
        return 0;
    }else {
        return -1;
    }
    return 0;
}




Last modification:January 12th, 2020 at 12:10 am
如果觉得我的文章对你有用,请随意赞赏