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 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ...
随机推荐
- javascript的replace方法的高级应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ios开发之--textview意见反馈页面(占位label,字数统计,提交按钮的交互设置)
记录一个页面的功能: textview的占位符,字数统计,提交按钮的交互设置,具体效果图如下:
- postgresql 指令
(1)用户实用程序: createdb 创建一个新的PostgreSQL的数据库(和SQL语句:CREATE DATABASE 相同) createuser 创建一个新的PostgreSQL的用户(和 ...
- Disruptor LMAX学习
http://lmax-exchange.github.io/disruptor/ http://bruce008.iteye.com/blog/1408075 http://code.google. ...
- Nginx 72万连接性能测试(一)
转自:http://my.oschina.net/chenzhuo/blog/150200?p=2#comments 根据系统内存64G估算单台tengine做反向代理最高支持72万连接.为了验证达到 ...
- 在线电路编程 (ICP)
通过在线电路编程(ICP)编程Flash.如果产品在开发中,或在终端客户的产品需要固件升级,采用硬件编程模式非常困难且不方便.采用ICP方式将很简单,且不需要将微控制器从板上拆下来.ICP方式同样允许 ...
- codeforces水题100道 第八题 Codeforces Round #274 (Div. 2) A. Expression (math)
题目链接:http://www.codeforces.com/problemset/problem/479/A题意:给你三个数a,b,c,使用+,*,()使得表达式的值最大.C++代码: #inclu ...
- iOS使用TFHpple解析html
iOS 开发中解析html 网上有很多写好的解析框架 今天就来讲一下如何用框架TFHpple来解析html 使用TFHpple解析html github地址:https://github.com/to ...
- VMware Workstation 14 黑屏的一个解决办法
近期很多朋友遇到了VMware Workstation 14开启或新建虚拟机后黑屏的现象,同时发现如果挂起虚拟机,可以显示挂起前最后的画面.显然,虚拟机核心是正常工作的,只是“显示”方面出现了问题. ...
- Mycat的简易安装及测试
1.环境 OS版本 CentOS release 6.5 (Final) 64bit DB版本 Mysql 5.6.37 Mycat 1.6 jdk1.7及以上版本 2.实战部署 1.创建用户及用户组 ...