cf 1409D. Decrease the Sum of Digits

2020-10-02 13:00:26

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;
}