cf 1409D. Decrease the Sum of Digits

题意

给你一个两个数m和n m可以不断地加一直到m所有位上的数字之和小于或等于n,最少可以加多少可以达到要求。

思路

如果最开始m所有位上数字之和小于或等于n就不用加直接输出0
每个位只有加到10进位剩下0的时候才会减少,我们可以从个位开始遍历m各个位数,每进一位总和会减少,判定一次,符合就结束输出。注意 99999这种情况,循环判定。

注意用pow计算10的次幂可能会不精确,自己单独写一个函数计算。

代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
long long int xx(int x)
{
	long long int sum=1;
	for(int i=0;i<x;i++){
		sum=sum*10;
	}
	return sum;
}
using namespace std;
int main()
{
	long long int t,n,x[101],sum,ans,m;
	char s[101];
	scanf("%lld",&t);
	while(t--){
		scanf("%s",&s);
		scanf("%lld",&m);
		ans=0;
		sum=0;
		for(int i=0;i<strlen(s);i++){
			x[i]=s[i]-'0';
			ans+=x[i];
		}
		for(int i=strlen(s)-1;i>=0;i--){
			if(ans<=m){
				break;
			}else{
				if(x[i]==0){
					continue;
				}
				sum+=(10-x[i])*xx(strlen(s)-1-i);
				while(1){
					ans-=x[i];
					if(x[i-1]==9){
						x[i-1]=0;
						ans-=9;
						i--;
					}else{
						x[i-1]+=1;
						ans+=1;
						break;
					}
				}
			}
		}
		printf("%lld\n",sum);
	}
	return 0;
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐