思路:
直接暴力肯定不行。
每一位数都有9个完美整数,如[1 2 3 4 5 6 7 8 9,11 22 33 44 55 66 77 88 99,........ ],样例最大到18位,那么一共就有18*9个完美整数,把他们都存到一个数组里,则(第一个大于l的下标 - 第一个大于等于r的下标)= 这个区间内的完美整数个数。
ps:之前想着算理想总的情况,在某一位去判断前面和后面该减几个,还要考虑目前是第几位,这样还有些没有二分简单好使。
代码:
#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
long long a[300];
int main(){
long long l, r;
cin >> l >> r;
// 将完美整数存入数组
for(int i = 1; i <= 9; i++){
long long s = 0;
for(int j = 1; j <= 18; j++){
s = s*10 + i;
a[++cnt] = s;
}
}
// 排序,使其有顺序
sort(a + 1, a + cnt + 1);
// 二分
cout << upper_bound(a + 1, a + cnt + 1, r) - lower_bound(a + 1, a + cnt + 1, l) << '\n';
return 0;
}
二分,思维