博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
紫书 例题 10-22 UVa 1640(数位统计)
阅读量:7211 次
发布时间:2019-06-29

本文共 1258 字,大约阅读时间需要 4 分钟。

这道题的题解有几个亮点

一个是每次只统计一个数字来简化思维

一个是统计当前位数的时候分三个部分来更新答案

具体看代码,有注释

#include
#include
#include
#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 10;int pow[MAXN], cnt[MAXN];int f(int d, int n) //分单个数字来统计,简化了思维过程 { char s[MAXN]; sprintf(s, "%d", n); int len = strlen(s), ans = 0; REP(i, 1, len) //如果是四位数,那么一,二,三位数的数字的个数可以直接统计,以此类推 { if(i == 1) ans++; else { ans += 9 * cnt[i-1]; if(d > 0) ans += pow[i-1]; //注意首位要单独出来统计 } } int pre[10]; //前i位数d出现的次数 REP(i, 0, len) { pre[i] = s[i] - '0' == d ? 1 : 0; if(i > 0) pre[i] += pre[i-1]; } REP(i, 0, len) { int maxd = s[i] - '0'; int mind = (i == 0 && len > 1); //首位不为0,只有0除外 REP(digit, mind, maxd) { ans += cnt[len-i-1]; //当前位数的后面的数 if(i > 0) ans += pre[i-1] * pow[len-i-1]; //当前位数的前面的数 if(digit == d) ans += pow[len-i-1]; //当前位数 } } return ans;}int main(){ pow[0] = 1; REP(i, 1, 9) { pow[i] = pow[i-1] * 10; //10的i次方 cnt[i] = pow[i-1] * i; //i位数中每个数字出现的次数(0可以为首位) } int a, b; while(~scanf("%d%d", &a, &b) && a) { if(a > b) swap(a, b); REP(d, 0, 10) { if(d) printf(" "); printf("%d", f(d, b + 1) - f(d, a)); } puts(""); } return 0;}

 

转载于:https://www.cnblogs.com/sugewud/p/9819497.html

你可能感兴趣的文章
Swoole 2019 :化繁为简、破茧成蝶
查看>>
Android RTL 及小语种 适配
查看>>
走近webpack(1)--多入口及devServer的使用
查看>>
jquery-weui滚动加载问题解决
查看>>
SpringBoot整合Shiro使用Ehcache等缓存无效问题
查看>>
“产学合作勇创新·协同育人书新篇”贵州理工大数据学院数据科学训练营结题答辩报告会圆满举行...
查看>>
EDEN-MACE 1.4.0 更新,增加数据清理功能
查看>>
ASP.Net中实现上传过程中将文本文件转换成PDF的方法
查看>>
营收放缓、股价暴跌、高管离职,Facebook迎来至暗时刻?
查看>>
MySQL探秘(二):SQL语句执行过程详解
查看>>
使用Akka持久化——消息发送与接收
查看>>
Spring框架之Filter应用
查看>>
在IDEA中设置自己的名字和时间
查看>>
@NotBlank注解地正确使用
查看>>
Android--音乐播放器
查看>>
互联网巨头布阵LoRaWAN,是又一春天还是不容乐观?
查看>>
CSS 全解析实战(一)-导读
查看>>
【深度学习再突破】让计算机一眼认出“猫”:哈佛提出新高维数据分析法
查看>>
C++程序设计基础(7)位运算
查看>>
MSDN-9月杂志推荐
查看>>