51nod 1042数字0-9的数量
两个数a,b(1 <= a <= b <= 10^18)
输出共10行,分别是0-9出现的次数
10 19
1
11
1
1
1
1
1
1
1
1
没什么思路 看了题解前半部分 说跟51nod上一道问1的个数的题很像
题目在这里
输入N(1 <= N <= 10^9)
输出包含1的个数
12
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
#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的数量的更多相关文章
- 51nod 1042 数字0-9的数量 数位dp
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-1 ...
- 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 ...
- (数位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次. 输入 ...
- 51nod- 【1042 数字0-9的数量 】
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 题目: 1042 数字0-9的数量 基准时间限制:1 ...
- 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次 ...
- 51 Nod1042 数字0到9的数量
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19 ...
- 51nod 1042 数位dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131 ...
- 字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||
换行的字符串 "This string\nhas two lines" 字符串中使用单引号时应该怎么写 'You\'re right, it can\'t be a quote' ...
- 【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始
第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ...
随机推荐
- openvpn记住用户名和密码,自动连接
1, 打开openvpn安装目录 2, 在config目录中, 找到VPN服务器的配置文件, 我的是config.ovpn,将 auth-user-pass (若已经存在)改为 auth-user-p ...
- ice服务初探
http://masterkey.iteye.com/blog/182975 http://blog.csdn.net/moxiaomomo/article/details/6773979 http: ...
- hibernate sqlite jdbctemplate 待研究
http://my.oschina.net/lldy/blog/39058 hibernate sqlite http://foru ...
- com.baidu.mapapi.CoordType
2.2.2升级到3.0.1百度报错了, 一:请检查.jar,.so是否是最新的 二:clear
- ajax和promise的结合使用
在需要依赖完成的ajax请求可使用promise保证执行顺序 在第一个请求正确返回后再发送第二个请求 /* 定义一个使用promise的ajax请求,这里依赖jquery 参数中请求url为必填参数 ...
- sklearn特征抽取
特征抽取sklearn.feature_extraction 模块提供了从原始数据如文本,图像等众抽取能够被机器学习算法直接处理的特征向量. 1.特征抽取方法之 Loading Features fr ...
- 一、K3 Cloud 开发插件《K3 Cloud开发手册》
1.K3 Cloud打开 提示错误:未能加载文件或程序集“XXXXXXXXX”或它的某一个依赖项 原因:未正常关机导致的Temporary ASP.NET Files文件夹下的文件损坏 解决:删除C: ...
- 四、K3 WISE 开发插件《工业单据老单插件开发新手指导》
开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 =============================================== 目录 一 ...
- CSS技巧:逐帧动画抖动解决方案
笔者所在的前端团队主要从事移动端的H5页面开发,而团队使用的适配方案是: viewport units + rem.具体可以参见凹凸实验室的文章 – 利用视口单位实现适配布局 . 笔者目前(2017. ...
- sysbench 压力测试工具
一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL. ...