这是一个沙雕题II(思维好题)

链接:https://ac.nowcoder.com/acm/contest/289/J
来源:牛客网

题目描述
因为gugugu非常喜欢9这个数字所以他希望把数字n变得末尾有尽可能多的9,不过他只能把n减小,且减小的数值不超过k,因为gugugu太菜了不会做这个题,所以需要你们帮他解答。
输入描述:

多组数据输入,第一行输入一个整数n代表需要变换的数,和一个整数k代表最大能减少的数值。(1 ≤ n ≤ 1018,0 ≤ k < n)

提示:OJ的测评机使用%lld输出64位整型(即long long).若你写代码的系统为XP,在XP上运行程序测样例时要改成%I64d才能正常输出,但是提交到OJ上的时候必须改回%lld,因为OJ不是xp系统的。

输出描述:
输出以最大数量的9在末尾且满足条件的数,如果有多个满足条件请输出最大的一个。
示例1
输入
复制
127 30
4521 89
输出
复制
99
4499

牛客上的题目真的挺锻炼思维的哎。
就像这个题目,一开始真的一点思维也没有。模拟也没有想法。后来发现,要是想让每一位后面有更多的9,只需要呢,在减数的时候,个位数比n的个位数多1,这样就好了,这样下去,每一位出来的都是9,只要不超过k,就可以一直减下去。
代码如下:

#include
#include
#include
#include
#define ll long long
using namespace std;

ll n,k;

int main()
{
	while(scanf("%lld%lld",&n,&k)!=EOF)
	{
		ll t;
		for(ll i=10;i<=n;i*=10)
		{
			ll x=n%i+1;
			if(x<=k&&x!=i) t=x;//如果本来就是9,就不用管了
			else break;
		}
		printf("%lld\n",n-t);
	}
}

努力加油a啊,(o)/~

你可能感兴趣的:(这是一个沙雕题II(思维好题))