网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(神奇的数)

3 篇文章 0 订阅
3 篇文章 0 订阅

题意分析:

(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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值