A. Sum of 2050
题目传送门:
题面:
题目大意:
问你一个1e18的数字,可不可以由2050/20500/205000…组成。可以则输出最少的个数,不可以就输出-1。
思路1:
还是挺巧妙的。
首先如果这个数不是2050的倍数,肯定就是-1了。
反之如果能除尽,肯定是有解法的。
当他可以被整除时,最优情况就是从能选的最大的数字开始一个个减去,直至为零。
其实就是整除后每位数字之和!
2050,10X2050,100X2050…
x/2050的十位数就是x/20500的结果。
所以整除后把每一位加起来就可以啦!
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
ll solve(ll x){
ll ans=0;
while(x){
ans+=x%10;
x/=10;
}
return ans;
}
int main(){
int T;
cin>>T;
while(T--){
ll n;
cin>>n;
if(n%2050)
cout<<-1<<endl;
else{
ll ans=n/2050;
cout<<solve(ans)<<endl;
}
}
}
思路2:
转换成字符串进行高精度除法。
其实一样的,这里不写了。