[CF1538F] Interesting Function 的题解
题目大意
给定两个正整数 \(l, r\),将 \(l\) 不断加 \(1\) 直到 \(l = r\),求出这一过程中 \(l\) 发生变化的位数总数。
- \(1 \le l < r \le 10^9\)。
思路
假设从 \(l\) 处理到 \(r\) 变化的次数为 \(f(l,r)\)。
因为直接求解出 \(f(l,r)\) 十分困难,所以可以通过求出 \(f(0,l)\) 和 \(f(0,r)\) 最后做差得到。
假设一个数为 \(x\) 那么从 \(0\) 一直变化到 \(x\) 对于各位变化的次数就是 \(x\)。
因为从 \(0\) 增加的 \(x\) 一共增加了 \(x\) 次。
而每当他增加一次,这个数的个位就会变化一次。
考虑从后向前数第 \(k\) 为,假设增加一次为 \(10^{k-1}\),那么随着每增加一次,第 \(k\) 位就会变化一次。
因为走后会变成 \(x\),所以第 \(k\) 位一共会变换 \(\lfloor x/10^{k-1}\rfloor\)。
\[f(0,l)=\sum _{i=0}^{(\log_{10}l)-1} \lfloor l/{10^i}\rfloor
\]
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50;
char a[N],b[N];
void solve(){
int ans=0;
cin>>a+1>>b+1;
int n=strlen(a+1),m=strlen(b+1);
for(int i=1,x=0;i<=n;i++){
x=x*10+a[i]-48;
ans-=x;
}
for(int i=1,x=0;i<=m;i++){
x=x*10+b[i]-48;
ans+=x;
}
cout<<ans<<'\n';
}
signed main(){
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}