今天看的是牛客竞赛网的一个题目:幸运数字2
这个题目我自己做了很多次,要么就是循环不进去,要么就是循环判断有误,反正我自己觉得逻辑上面没问题的,但运行不成功,最后还是来理解别人的代码吧
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
long long a[1000006];
int main()
{
long long x,y;
cin>>x>>y;
a[1]=4;a[2]=7;
long long j=1,w=2;
while(a[j]*10<1e10)
{
a[++w]=a[j]*10+4;
a[++w]=a[j]*10+7;
j++;
}
long long h=0;
for(int i=1;i<w;i++)
{
if(a[i]>=x&&x<=y)
{
if(a[i]<=y)
{
h+=(a[i]-x+1)*a[i];
x=a[i]+1;
}
else if(a[i]>=y)
{
h+=(y-x+1)*a[i];
x=a[i]+1;
}
}
if(x>y)
break;
}
printf("%lld\n",h);
return 0;
}
首先将符合幸运数字的数字放入一个数组中,接下来就是进行判断再相加了。
判断的操作是先判断数组的某一位数是否大于等于输入进来l和小于等于输入进来的r。如果不是就结束循环。如果是的话,就将这个数减去x-1,得出来前面有几个小于数组的数,然后相乘,就得出在l到a[i]的幸运数字和,再对l重新赋值等于数组的数+1。如果数组的数大于r,也就是说到了连续的数的最后一段了。将r-l+1,得到最后一段幸运数字的和。至此这个题目解决了。