题意分析:
(1)数论的题目,给出一个long long类型的范围[N,M],求出这个范围中满足三个条件的数的个数:
①这个数至少包含('2', '3', '5')中的任意一个数字;
② 这个数不能出现'18';
③这个数能被7整除。
(2)对于第一、三个条件比较好判断,第二个条件可以通过每次将这个数整除10,然后对100取模,看结果是否等于18,如不等于,则再除以10,依次循环,直到除完或者余数为18
(3)根据第三个条件是7的倍数这一性质,可以遍历找到第一个能被7整除的符合条件的数,以后遍历的步长为7
可能坑点:
(1)本题方法比较暴力,虽然尽量缩短了遍历范围,可能由于数的范围太大,造成超时,暂时还没有想到好的解法,希望大牛们指点、鞭笞一二.
#include <iostream>
using namespace std;
bool cal(long long num)
{
bool flag=false;
if(num%7!=0)return false;
while(num>0)
{
int temp1=num%10;
int temp2=num%100;
if(temp2==18)return false;
if(temp1==2||temp1==3||temp1==5)flag=true;
num=num/10;
}
if(!flag)return false;
return true;
}
int main()
{
int S;
long long N,M;
cin>>S;
while(S--)
{
cin>>N>>M;
long long res=0;
long long i=N;
for(;i<=M;i++)
{
if(cal(i))
{
res++;
break;
}
}
long long j=i;
for(;j<=M;j+=7)
{
if(cal(j))res++;
}
cout<<res<<endl;
}
return 0;
}