题目大意:输入一个范围,在范围内取几个区间,区间内的所有数当区间分界来计算,所有区间分界都是由4或7组成的。例:2~7 分界为 4, 7。则2~4当作4计算,5~7当作7计算,结果为33。
解题思路:打表将所有区间分界按大小顺序存入数组,然后在范围内判断,先搜素第一个区间分界的位置,则从开头到第一个区间分界都为区间分界的值。如果一次一次加会超时。所有在这一个的区间分界不够大时,计算并将区间分界位置移动。
ac代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
queue <int>qu;
long long num[10005], temp, sum;
int cnt, n, m, pos;
void bfs()
{
while (!qu.empty())
qu.pop();
qu.push(4);
qu.push(7);
cnt = 2;
num[0] = 4, num[1] = 7;
while (!qu.empty()){
temp = qu.front();
if (temp > 444444444)
return ;
qu.pop();
qu.push(temp*10 + 4);
qu.push(temp*10 + 7);
num[cnt++] = temp*10 + 4;
num[cnt++] = temp*10 + 7;
}
}
int main()
{
bfs();
while (scanf("%d%d", &n, &m)!=EOF){
sum = 0;
for (int i=0; ; i++)
if (num[i] >= n){
pos = i;
break;
}
cnt = 0;
for (int i=n; i<=m; i++)
if (i <= num[pos])
cnt++;
else {
sum += cnt * num[pos];
pos++;
cnt = 1;
}
sum += cnt * num[pos];
cout << sum << endl;
}
return 0;
}