tabris有一个习惯,无聊的时候就会数圈圈,无论数字还是字母。
现在tabris更无聊啦,晚上睡不着觉就开始数羊,从a只数到b只。
顺便还数了a到b之间有多少个圈。
但是tabris笨啊,虽然数羊不会数错,但很可能数错圈的个数。
但是tabris很难接受自己笨这个事实,所以想问问你他一共应该数出多少个圈,这样tabris才好判断他到底笨不笨啊。
输入描述:
输入一个T,表示数据组数每组测试数据包含两个正整数a,b。T∈[1,50]a,b∈[1,106]
输出描述:
每组数据输出结果,并换行。
示例1
备注:
数字的圈的个数请根据样例自行理解。
思路:首先,定义一个常量数组 c,用于存储数字 0 到 9 的权重。例如,c[0] = 1 表示数字 0 的权重是 1,c[1] = 0 表示数字 1 的权重是 0,依此类推。其次定义两个数组 x 和 s,其中 x[i] 用于存储数字 i 的权重,s[i] 用于存储从 1 到 i 的所有数字的权重之和。在 init() 函数中,遍历从 1 到 N 的每一个数字 i,计算其权重并存储在 x[i] 中。权重的计算方法是通过检查数字 i 的每一位,根据 c 数组中对应位置的值来累加权重。然后,计算前缀和数组 s,其中 s[i] = s[i-1] + x[i],这样 s[i] 就包含了从 1 到 i 的所有数字的权重之和。最后使用前缀和数组 s 来快速计算从 a 到 b 的所有数字的权重之和。具体来说,s[b] - s[a-1] 可以得到结果,因为 s[b] 包含了从 1 到 b 的权重之和,而 s[a-1] 包含了从 1 到 a-1 的权重之和,两者的差值就是从 a 到 b 的权重之和。
#include<iostream> using namespace std; const int N = 1e6; int c[10]={1,0,0,0,1,0,1,0,2,1}; int x[N+1],s[N+1]; void init() { for(int i = 1;i<=N;i++) { int t = i; while(t) { x[i]+=c[t%10]; t/=10; } } for(int i = 1;i<=N;i++) s[i]=s[i-1]+x[i]; } int main() { int n; cin>>n; init(); while(n--) { int a,b; cin>>a>>b; cout<<s[b]-s[a-1]<<endl;; } return 0; }