列表

详情


QY19. 最后一位

描述

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

输入描述

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

输出描述

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

示例1

输入:

564

输出:

509

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 464KB, 提交时间: 2019-03-19

#include<stdio.h>
long long binSearch(long long n);
long long decompose(long long n);
int main()
{
	long long n,a;
	scanf("%lld", &n);
	a = binSearch(n);
	printf("%lld\n", a);
	return 0;
}
long long binSearch(long long n)
{
	long long high=n,low=n-2*(n/10),mid,mid1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		mid1 = decompose(mid);
		if (n < mid1)
			high = mid - 1;
		else if (n > mid1)
			low = mid + 1;
		else
			return mid;
	}
	return -1;
}
long long decompose(long long n)
{
	long long sum = 0;
	while (n != 0)
	{
		sum = sum + n;
		n = n / 10;
	}
	return sum;
}

C 解法, 执行用时: 2ms, 内存消耗: 236KB, 提交时间: 2019-04-29

#include<stdio.h>
long   he(long  i)
{
     long sum=0,w=1;
    while(i)
    {
        sum=sum+i;
        i=i/10;
    }
    return sum;
}
long  zhao( long x)
{
    long  high=x,low=x-2*(x/10),mid,mid1;
    while(low<=high)
    {
        mid=(high+low)/2;
        mid1=he(mid);
        if(mid1<x)
            low=mid+1;
        else if(mid1>x)
            high=mid-1;
        else
        {
            return mid;
        }
    }
    return  -1;
}
int main()
{
    long  x,w=0,t;
    scanf("%ld",&x);
    w=zhao(x);
    printf("%ld",w);
    
}

上一题