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(总结)

谢谢观看