【每日一题】数码

数码

http://www.nowcoder.com/questionTerminal/a69696beeec24ba784fae9e34c8ab2da

题目大意是给你两个整数l,r,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。
这个题我们可以考虑枚举因子,我们考虑从1-r段所有的数码出现次数,我们假设a和b是因子,那么a最大取图片说明 ,那么我们就只要两次循环,第一层枚举a,第二层枚举b,但是为了简便运算过程,我们再额外加一层循环,k从1取到9,分别记录a和b的首位数字,这里要注意别重复计数。最后我们直接f(r)-f(l-1)就可以得到结果了~

#include
using namespace std;
#define int long long 
int l,r,a[20],b[20];
int ks(int x)
{
    int ans=0;
    while(x)
    {
        ans=x%10;
        x/=10;
    }
    return ans;
}
void f(int r,int *a)
{
    for(int i=1;i*i<=r;i++)
    {
        int b=r/i;
        for(int j=1;j<=r;j*=10)
        {
            for(int k=1;k<10;k++)
            {
                int x=max(k*j,i+1);
                int y=min((k+1)*j-1,b);
                if(y>=x) a[k]+=y-x+1;
            }
        }
        int t=ks(i);
        a[t]+=b-i+1;
    }
}
signed main()
{
    scanf("%lld%lld",&l,&r);
    f(l-1,a);
    f(r,b);
    for(int i=1;i<=9;i++)
        printf("%lld\n",b[i]-a[i]);
    return 0;
}
全部评论

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务