题目大意:输入一个范围,在范围内取几个区间,区间内的所有数当区间分界来计算,所有区间分界都是由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;
}