基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
 收藏
 关注
给出一段区间a-b,统计这个区间内0-9出现的次数。
比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次。
Input
两个数a,b(1 <= a <= b <= 10^18)
Output
输出共10行,分别是0-9出现的次数
Input示例
10 19
Output示例
1
11
1
1
1
1
1
1
1
1

没什么思路 看了题解前半部分 说跟51nod上一道问1的个数的题很像

题目在这里

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
 收藏
 关注
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5

感觉思路真的挺巧妙的 统计各个位数是1的数

比如:12。个位上可能出现1的数为1,11(一共2个),十位上可能出现1的个数为10,11,12(一共3个),加一起正好是5。(至于11是否重复的问题,还是再理解一下上面的做法,这个做法只考虑了每一位出现1的数,11在个位上算和在十位上算是不一样的,所以并没有重复)。

21905:

个位:它出现1的数为:1 ~ 21901,一共 2190 - 0 + 1 = 2191

十位:它出现1的数为:1x ~ 2181x (x 从0到9)一共:(218 - 0 + 1)*10 = 2190

百位:它出现1的数为:1xx ~ 211xx ,一共:(21 - 0 + 1)* 100 = 2200

千位:它出现1的数为:1xxx ~ 11xxx 和 21000 ~ 21905 ,那么很明显,这个情况就比较特殊了,为什么呢?下面再说,我们先计数,一共:(1 - 0 + 1)*1000 + (905 - 0 + 1)= 2000 + 906 = 2906

万位:它出现1的数为:1xxxx ~ 1xxxx,一共:10000

那么现在这道题相当于就是把1009的代码改一下,不仅仅是看1了
把1到a-1的统计一下 1到b的统计一下 相减就是结果了
但是写了以后发现还有问题 因为0比较特殊 不能作为分母 也不能用来取模
改了半天 发现还是得重新写一个针对0的函数
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cstring>
#include <cmath>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std; ll a, b;
ll ansa[10], ansb[10]; ll cntnum(int num, ll n)
{
ll ans = 0, tmp = n;
long long tnum = 1;
while(tmp){
long long t = tmp % 10;
if(t < num && num){
ans += n / (tnum * 10) * tnum;
}
else if(t == num){
if(num){
ans += n / (tnum * 10) * tnum;
ans += (n % tnum) + 1;
}
else ans++;
}
else{
if(num)ans += (n / (tnum * 10) + 1) * tnum;
else ans++;
} tnum *= 10;
tmp /= 10;
} return ans;
} ll cnt0(ll n)
{
ll i = 1;
ll ans = 0;
ll before = 0, cur = 0, after = 0;
while((n / i)){
cur = (n / i) % 10;
before = n / (i * 10);
after = n - (before * 10 + cur) * i;
if(cur == 0){
ans += (before - 1) * i + after + 1;
}
else{
ans += before * i;
}
i *= 10;
}
return ans;
} int main()
{
while(scanf("%I64d%I64d", &a, &b) != EOF){
memset(ansa, 0, sizeof(ansa));
memset(ansb, 0, sizeof(ansb));
ansa[0] = cnt0(a - 1);
ansb[0] = cnt0(b);
for(int i = 1; i <= 9; i++){
ansa[i] = cntnum(i, a - 1);
ansb[i] = cntnum(i, b);
//cout<< ansb[i] - ansa[i]<<endl;
}
/*while(a){
ansa[a % 10]--;
a /= 10;
}*/ for(int i = 0; i <= 9; i++){
cout<< ansb[i] - ansa[i]<<endl;
} }
return 0;
}

新改的这份代码应该会更容易理解一点

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cstring>
#include <cmath>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std; ll a, b;
ll ansa[10], ansb[10]; /*ll cntnum(int num, ll n)
{
ll ans = 0, tmp = n;
long long tnum = 1;
while(tmp){
long long t = tmp % 10;
if(t < num){
ans += n / (tnum * 10) * tnum;
}
else if(t == num){
ans += n / (tnum * 10) * tnum;
ans += (n % tnum) + 1;
}
else{
ans += (n / (tnum * 10) + 1) * tnum;
} tnum *= 10;
tmp /= 10;
} return ans;
}*/ ll cnt0(ll n)
{
ll i = 1;
ll ans = 0;
ll before = 0, cur = 0, after = 0;
while((n / i)){
cur = (n / i) % 10;
before = n / (i * 10);
after = n - (before * 10 + cur) * i;
if(cur == 0){
ans += (before - 1) * i + after + 1;
}
else{
ans += before * i;
}
i *= 10;
}
return ans;
} ll cntnum(int num, ll n)
{
ll i = 1;
ll ans = 0;
ll before = 0, cur = 0, after = 0;
while((n / i)){
cur = (n / i) % 10;
before = n / (i * 10);
after = n - (before * 10 + cur) * i;
if(cur == num){
ans += before * i + after + 1;
}
else if(cur < num){
ans += before * i;
}
else{
ans += (before + 1) * i;
}
i *= 10;
}
return ans;
}
int main()
{
while(scanf("%I64d%I64d", &a, &b) != EOF){
memset(ansa, 0, sizeof(ansa));
memset(ansb, 0, sizeof(ansb));
ansa[0] = cnt0(a - 1);
ansb[0] = cnt0(b);
for(int i = 1; i <= 9; i++){
ansa[i] = cntnum(i, a - 1);
ansb[i] = cntnum(i, b);
//cout<< ansb[i] - ansa[i]<<endl;
}
/*while(a){
ansa[a % 10]--;
a /= 10;
}*/ for(int i = 0; i <= 9; i++){
cout<< ansb[i] - ansa[i]<<endl;
} }
return 0;
}

51nod 1042数字0-9的数量的更多相关文章

  1. 51nod 1042 数字0-9的数量 数位dp

    1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-1 ...

  2. 51nod 1042 数字0-9的数量

    给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Inp ...

  3. (数位DP)51NOD 1042 数字0-9的数量

    给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次.   输入 ...

  4. 51nod- 【1042 数字0-9的数量 】

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 题目: 1042 数字0-9的数量 基准时间限制:1  ...

  5. 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串

    1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次 ...

  6. 51 Nod1042 数字0到9的数量

    1042 数字0-9的数量  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19 ...

  7. 51nod 1042 数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131 ...

  8. 字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||

    换行的字符串 "This string\nhas two lines" 字符串中使用单引号时应该怎么写 'You\'re right, it can\'t be a quote' ...

  9. 【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始

    第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ...

随机推荐

  1. openvpn记住用户名和密码,自动连接

    1, 打开openvpn安装目录 2, 在config目录中, 找到VPN服务器的配置文件, 我的是config.ovpn,将 auth-user-pass (若已经存在)改为 auth-user-p ...

  2. ice服务初探

    http://masterkey.iteye.com/blog/182975 http://blog.csdn.net/moxiaomomo/article/details/6773979 http: ...

  3. hibernate sqlite jdbctemplate 待研究

    http://my.oschina.net/lldy/blog/39058                                   hibernate sqlite http://foru ...

  4. com.baidu.mapapi.CoordType

    2.2.2升级到3.0.1百度报错了, 一:请检查.jar,.so是否是最新的 二:clear

  5. ajax和promise的结合使用

    在需要依赖完成的ajax请求可使用promise保证执行顺序 在第一个请求正确返回后再发送第二个请求 /* 定义一个使用promise的ajax请求,这里依赖jquery 参数中请求url为必填参数 ...

  6. sklearn特征抽取

    特征抽取sklearn.feature_extraction 模块提供了从原始数据如文本,图像等众抽取能够被机器学习算法直接处理的特征向量. 1.特征抽取方法之 Loading Features fr ...

  7. 一、K3 Cloud 开发插件《K3 Cloud开发手册》

    1.K3 Cloud打开 提示错误:未能加载文件或程序集“XXXXXXXXX”或它的某一个依赖项 原因:未正常关机导致的Temporary ASP.NET Files文件夹下的文件损坏 解决:删除C: ...

  8. 四、K3 WISE 开发插件《工业单据老单插件开发新手指导》

    开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 =============================================== 目录 一 ...

  9. CSS技巧:逐帧动画抖动解决方案

    笔者所在的前端团队主要从事移动端的H5页面开发,而团队使用的适配方案是: viewport units + rem.具体可以参见凹凸实验室的文章 – 利用视口单位实现适配布局 . 笔者目前(2017. ...

  10. sysbench 压力测试工具

    一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL. ...