链接:
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;
}
!