链接:https://ac.nowcoder.com/acm/problem/15291
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,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)。
输出描述:
一个数字表示答案。
输入
2 7
输出
33
思路:
这道题可以用打表记录下所有的幸运数字,再在l到r这个区间去遍历就好。
代码
#include<iostream> #include<map> #include<queue> using namespace std; const long long ma = 5000000000; long long ant=0,ans=0; long long s[100005]; long long l,r; map<long long,long long>mp; void da(){ queue<long long>q; q.push(4); q.push(7); while(!q.empty()){ long long x=q.front(); q.pop(); s[++ant]=x; if(x*10+4<=ma&&!mp[x*10+4]){ q.push(x*10+4); mp[x*10+4]=1; } if(x*10+7<=ma&&!mp[x*10+7]){ q.push(x*10+7); mp[x*10+7]=1; } } } int main(){ da();//打表用s数组记录4-ma中所有的幸运数字 cin>>l>>r; for(int i=1;i<=ant;i++){ if(s[i]>=l){ if(s[i]<=r){ ans+=(s[i]-l+1)*s[i];//最小区间长度乘对应的幸运数字则为这个区间幸运数值的和 l=s[i]+1; } else{ ans+=(r-l+1)*s[i];//最小区间长度乘对应的幸运数字则为这个区间幸运数值的和 l=r+1; } } if(l>r){//若l>r,则遍历结束,输出答案 cout<<ans; return 0; } } return 0; }