nowcoder数圈圈 | 51nod1042 数字0-9的数量

来源:互联网 发布:双色球合买软件 编辑:程序博客网 时间:2024/05/20 19:48

https://www.nowcoder.com/acm/contest/30/D
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042
两个题都是用这个方法
数圈圈
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

tabris有一个习惯,无聊的时候就会数圈圈,无论数字还是字母。
现在tabris更无聊啦,晚上睡不着觉就开始数羊,从a只数到b只。
顺便还数了a到b之间有多少个圈。

但是tabris笨啊,虽然数羊不会数错,但很可能数错圈的个数。
但是tabris很难接受自己笨这个事实,所以想问问你他一共应该数出多少个圈,这样tabris才好判断他到底笨不笨啊。 

输入描述:

输入一个T,表示数据组数
每组测试数据包含两个正整数a,b。
T∈[1,1000]
a,b∈[1,1014]

输出描述:

每组数据输出结果,并换行。
示例1

输入

111 12 23 34 45 56 67 78 89 910 101 100

输出

0001010211111

备注:

数字的圈的个数请根据样例自行理解。

题意:0这个数字是一个圈,同样的,4,6,9,都是一个圈,8是两个圈,其他数字没有圈,样例给的很清楚。

思路:前两天做过一道类似的题,跟这个做法一模一样(https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042)。

先统计a到b这个区间(0-9)每个数字出现的个数,最后计算每个数字的贡献。

现在问题是求每个数字出现了多少次。

举个栗子:55211这个带下划线的位置出现了多少次的2(在1到55211这些数字中)

答案是55*100+11+1次   及(0-54)2(00-99),还有552(00-11);这个应该能看懂。

那如果统计这个位置3出现的次数呢? 答案是:55*100次 。    及(0-54)3(00-99)       553(..)没有这样的数字

那如果统计这个位置1出现的次数呢? 答案是:56*100次 。    及(0-55)1(00-99)

那么这样你就能统计这个位置可能出现的0-9这些数字各出现了多少次了,那么你再枚举每一个位置即可,复杂度就是9*(这个数字的位数)。

还有一种特殊情况:0的次数可能有偏差(因为没有前导0的存在)

举个栗子:5000这个带下划线的位置出现了多少次的0(在1到1000这些数字中)

如果按照上面的规则计算的话,是5*100+1 次。   及(0-4)0(0-99)和50(00-00)显然前面为0的100次是不存在的(及00(00-99)),所以要减去这种情况。0出现的次数:个位减去1,十位减去10,百位减去100,以此类推。

#include<iostream>#include<stdio.h>#include<cstring>#include<cstdlib>#include<math.h>#include<vector>#include<queue>#include<algorithm>#define LL long long#define N 50050const LL mod=1e9+7;using namespace std;int v[20]= {1,0,0,0,1,0,1,0,2,1};LL s[15];void slove(LL x,int flag){    LL sum=1,qian,zhong,hou;    while(1)    {        qian=x/sum/10;        zhong=x/sum%10;        hou=x%sum;        if(hou==x) break;        for(int i=0; i<10; i++)        {            if(i<zhong) s[i]+=(qian+1)*sum*flag;            else if(i==zhong) s[i]+=(qian*sum+hou+1)*flag;            else if(i>zhong) s[i]+=(qian*sum)*flag;        }        s[0]-=sum*flag;        sum*=10;    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(s,0,sizeof s);        LL a,b;        scanf("%lld%lld",&a,&b);        slove(b,1);        slove(a-1,-1);        LL ans=0;        for(int i=0; i<10; i++)            ans+=v[i]*s[i];        printf("%lld\n",ans);    }}














原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 预约科目三成功后没交钱怎么办 预约成功后驾校不提交档案怎么办 c2刚满一年的驾照扣12分怎么办 怀孕6个月咳嗽很厉害怎么办 家门口有电线杆影响我建楼房怎么办 卡丢了不知道卡号怎么办 驾考网上预约用户被锁定了怎么办 人才中心拿出来的户口掉了怎么办 父母是南京集体户孩子没户口怎么办 二建挂靠中介单位不给证怎么办 小包工头遇到工人在工地摔伤怎么办 外地人买了城中村的房子改造怎么办 深圳社保怀孕了产检异地怎么办 成都公租房租满6年怎么办 二建审核资料如果照片丢失怎么办 身份证被冒用在外地办社保怎么办 蔷薇的嫩叶都被太阳晒死了怎么办 乐视手机进水了屏幕失灵怎么办 乐视手机进水了屏幕不显示怎么办 美团商家单量出现下滑怎么办 想开个小超市没经营过怎么办 华为7c手机wifi信号差怎么办 贞子从电视里爬出来怎么办 2个月的婴儿吓到怎么办 排卵日同房了没避孕怕怀孕怎么办 妻子因为我欺骗她要跟我离婚怎么办 老婆用苹果手机共享我的位置怎么办 孕妇餐后2小时血糖偏高怎么办 孕妇血糖餐后2小时数值高怎么办 股市退市的话股民的钱怎么办 美股股票退市了手里的股票怎么办 坐高铁安检时怕把包包弄坏了怎么办 很贵的包包高铁安检怎么办 如果过高铁安检东西被扣留怎么办 邻居家小孩把我家东西弄坏了怎么办 邻居早上6点放音乐扰民怎么办 隔壁楼邻居天天放音乐很吵怎么办 发现老公在卧室安了摄像头怎么办 憋的尿又没有厕所的时候怎么办 一岁宝宝拉屎总是拉出血怎么办 孩子鼻窦炎鼻子堵有白色鼻涕怎么办