4.幸运数(sum)
题目描述
4和7是味味的幸运数字。幸运数是那些只由幸运数字组成的正整数。如47,477是幸运数,而5,17,417 就不是幸运数。
定义next(x)为大于或等于x的最小的幸运数。
味味对以下表达式的值很感兴趣 :
next(L)+next(L+1)+…+next(R-1)+next(R )。
现在告诉你L和R的值,希望你能帮助味味计算出这个表达式的值。
输入
输入文件sum.in仅一行包含两个正整数L和R(1≤L≤R≤10^9 ),L和R的值之间用一个空格分隔。
输出
输出文件sum.out 只有一行一个整数,表示表达式的值。
样例输入
【样例输入1】
2 7
【样例输入2】
7 7
样例输出
【样例输出1】
33
【样例输出2】
7
数据范围限制
对于 20%的数据,1≤L≤R≤1000
对于 40%的数据,1≤L≤R≤10^6
另有20%的数据,L=R
对于 100%的数据,1≤L≤R≤10^9
提示
【样例 1 说明】
next(2)+next(3)+next(4)+next(5)+next(6)+next(7)=4+4+4+7+7+7=33
【样例 2 说明】
next(7)=7
正解
我们把小于等于44444444444(←11个4)的由4和7组成的幸运数都找出来,存到一个数组里,再用个while语句就可以了
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
long long l,r,tot,s,a[3005];//要用long long
void zh()//这个是找所有的幸运数的组合,从小到大
{
int o=1;
tot=2;
a[1]=4;//初值
a[2]=7;
while(1)
{
if(o>1024) break;
a[++tot]=a[o]*10+4;
a[++tot]=a[o]*10+7;
o++;
}
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
zh();
cin>>l>>r;
tot=1;
while(a[tot]<l&&a[tot]!=l)tot++;//找到第一个大于等于l的数
if(l==r)cout<<a[tot];//如果相等就直接输出
if(l<r)
{
while(l<=r)//while
{
int x=min(a[tot]-l,r-l)+1;//避免取太多,有一定范围
s+=a[tot]*x;
l+=x;//加乘的个数
tot++;//记得加1
}
cout<<s;
}
return 0;
}
下面附本次比赛的其它题目
2020.02.29模拟赛11(第一题)
2020.02.29模拟赛11(第二题)
2020.02.29模拟赛11(第三题)
2020.02.29模拟赛11(第四题)
2020.02.29模拟赛11(第五题)
2020.02.29模拟赛11(总结)