D. Decrease the Sum of Digits

Problem - 1409D - Codeforces

 题意:
 

你得到了一个正整数n。在一次移动中,你可以使n增加1(即使n:=n+1)。你的任务是找出为了使n的数位之和小于或等于s,你需要执行的最小移动数。

你必须回答t个独立的测试案例。

输入
输入的第一行包含一个整数t(1≤t≤2⋅104)--测试案例的数量。接着是t个测试用例。

测试用例的唯一一行包含两个整数n和s(1≤n≤1018;1≤s≤162)。

输出
对于每个测试用例,打印答案:为了使n的数位之和小于或等于s,你需要执行的最小移动数。

例子
输入
5
2 1
1 1
500 4
217871987498122 10
100000000000000001 1
输出
8
0
500
2128012501878
899999999999999999

题解:
题意很明确,模拟即可

但是看到大佬的代码发现还能这样写,极其简洁

我们直接从末尾开始枚举,先让n + 当前的数位 

1~9 10

10 ~99  100

....            b

然后减n%(b)的数

看符不符合条件即可

#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
long long check(long long x)
{
	long long s = 0;
	while(x)
	{
		s += x%10;
		x = x/10;
	}
	return s;
}
void solve()
{
	long long n,m;
	cin >> n >>m;
	long long k = n;
	long long b = 10;
	while(check(n)>m)
	{
		n +=b - n%b;
		b = b*10;
	}
	cout<<n-k<<"\n";
}
int main()
{
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve();
	}
}
//
//

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值