链接:
https://www.nowcoder.com/acm/contest/70/B
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
定义next(x)为大于等于x的第一个幸运数字。给定l,r,请求出next(l) + next(l + 1) + ... + next(r - 1) + next(r)。
比如说,47、744、4都是幸运数字而5、17、467都不是。
定义next(x)为大于等于x的第一个幸运数字。给定l,r,请求出next(l) + next(l + 1) + ... + next(r - 1) + next(r)。
输入描述:
两个整数l和r (1 <= l <= r <= 1000,000,000)。
输出描述:
一个数字表示答案。
解题思路:这里主要是dfs(),用递归算法来计算出所有的包含4和7的数字,并且将它们存放在一个二维数组a[]中,之后对她们进行排序,按照顺序找出从l到r的next()值,然后相加!
AC代码:
#include<iostream> #include<algorithm> using namespace std; long long int a[10500]; int t = 0; long long int l, r; long long int ans=0; void dfs(long long int number) { if (number > 4444444444) return; a[t++] = number; dfs(number * 10 + 4); dfs(number * 10 + 7); } int main() { dfs(0); a[t] = 4444444444; sort(a, a + t); scanf("%lld%lld", &l, &r); for (long long int i = 0; i <= t; i++) { //printf("%lld ", a[i]); while (a[i] >= l&&l <= r) { ans += a[i]; l++; } } printf("%lld\n", ans); return 0; }
!