写在前面:
参考博客:live4m
很有意思的一个题。
---------------------------------------------------------------------------------------------------------------------------------
原题链接:
题目大意:
给你两个整数l和r,其中l<r。我们将在l上加1,直到结果等于r为止。对于每一个这样的加法,让我们看看在它之后会有多少个数字被改变。
比如说。
如果l=909,那么加1的结果是910,有2位数字会被改变。
如果你在l=9的基础上加1,结果将是10,2位数字也将被改变。
如果你在l=489999上加一,结果将是490000,5个数字将被改变。
被改变的数字总是构成以十进制系统书写的结果的后缀。
输出改变的数字总数,如果你想从l得到r,每次加1。
输入
第一行包含一个整数t(1≤t≤104)。接着是t个测试用例。
每个测试用例都有两个整数l和r(1≤l<r≤109)。
输出
对于每个测试案例,如果你想从l得到r,计算改变的数字总数,每次加一个。
解题思路:
发现询问是形如[l,r]的一个区间,
那么可以将问题变成[0,r]-[0,l].
设cal(x)为[1,x]的值,
考虑cal(x)如何计算:
按十进制位考虑贡献,
个位变化的次数为x,
十位变化的次数为x/10,
百位变化的次数为x/10/10,
AC代码:
#include <iostream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <vector>
#include <string>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <unordered_map>
#define guo312 std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define ll long long
#define Inf LONG_LONG_MAX
#define inf INT_MAX
#define endl "\n"
using namespace std;
int getnum(int num){
int re=0;
while(num){
re+=num,num/=10;
}
return re;
}
int main(){
guo312;
int t; cin>>t;
while(t--){
int l,r; cin>>l>>r;
cout<<getnum(r)-getnum(l)<<endl;
}
return 0;
}