1049 Counting Ones
1. 这一题起初我用递归的方式,还写了一个数整数有多少个1的函数,OneNum[i] = OneNum[i-1]+countOne(i);毫不意外地出现了段错误,也就是递归调用的次数太多。
2. 看了参考书,得到了思路上的启发:
给定一个数12,我们可以数从1到12,在个位上和十位上1这个数字各自出现了多少次,然后将二者相加。个位上在1-10中1出现了一次,在11-12中1出现了1次,共2次;十位上在10-12中1出现了3次,3+2=5。
如果一个数字还看不出规律,再举一个数123。个位上在1-10中出现1次,11-20中出现1次,……,120-123中出现一次,一共是123/10+1 = 13次,十位上在1-100中出现10次,在101-123中出现10次,一共是(123/100+1)*10 = 20次,百位上在100-123中出现了123-100+1=24次。
依然看不出,再举一个数1234。个位上出现1234/10+1=124次,十位上出现(1234/100+1)*10=130次,百位上出现(1200/1000+1)*100=200次,千位上出现1234-1000+1=235次。
依稀有些眉目了,但是刚才举得例子都是从大到小,现在再举一例4111。个位上出现4111/10+1=412次,10位上出现4111/100*10+(1-0+1)=412次,百位上出现4111/1000*100+(4111%100+1)=412次,千位上出现1*1000次。
可以看出如果当前位上的数字大于1,该位置上1出现多少次仅仅取决于前面的数字,如果等于1还取决于后面的数字。现在再举1例看看小于1的情况。
4001
对于个位:4001/10+1
对于10位:4001/100
对于100位:4001/1000
对于1000位:1*1000
abcde
e所在位:if(e<1)abcd,if(e>=1)abcd+1
d所在位:if(d<1)abc*10,if(d==1)abc*10+e+1,if(d>1)(abc+1)*10
c所在位:if(c<1)ab*100,if(c==1)ab*100+de+1,if(c>1)(ab+1)*100
b所在位:if(b<1)a*1000,if(b==1)a*1000+cde+1,if(b>1)(a+1)*1000
a所在位:if(a==1)bcde+1,if(a>1)1*10000
对于最低位和最高位可以特判。
将读入的整数n转化为字符串str,L为字符串的长度
首先将字符串翻转,最低位对应下标0。
if(str[0]<1)one_count += n/pow(10,i+1);else one_count += n/pow(10,i+1)+1;
最高位对应下标L-1
if(str[L-1]==1)one_count += n%pow(10,L)+1;else one_count += 1*pow(10,L)
对于当中任意位i
if(str[i]<1)one_count += n/pow(10,i+1)*pow(10,i)
if(str[i]==1)one_count += n/pow(10,i+1)*pow(10,i)+n%pow(10,i)+1
if(str[i]>1)one_count += (n/pow(10,i+1)+1)*pow(10,i)
注意一些细节:
1. pow得到的是浮点数,如果在mod后面会报错,如果在除号后面会导致除法的结果是浮点数,因此要在前面加强制类型转换。
新习得的方法:
1.从特殊到一般找规律
2.如果出错,用自己的测试用例debug
AC代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>using namespace std;
typedef long long LL;const int maxn = 110;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;int main(){int n;scanf("%d",&n);char temp[20],str[20];sprintf(temp,"%d",n);int L = strlen(temp);for(int i=0;i<L;i++){//将字符串反转 str[i] = temp[L-1-i];}int count_one = 0; //最低位 if(str[0]-'0'<1)count_one += n/10;else count_one += n/10+1;//最高位if(L-1>0){//防止只有1位数的特殊情况 if(str[L-1]-'0'==1)count_one += n%(int)pow(10,L-1)+1;else count_one += 1*(int)pow(10,L-1);}//中间位for(int i=1;i<L-1;i++){if(str[i]-'0'<1)count_one += n/(int)pow(10,i+1)*(int)pow(10,i);else if(str[i]-'0'==1)count_one += n/(int)pow(10,i+1)*(int)pow(10,i)+n%(int)pow(10,i)+1;else if(str[i]-'0'>1)count_one += (n/(int)pow(10,i+1)+1)*(int)pow(10,i);} printf("%d",count_one);return 0;
}
1049 Counting Ones相关推荐
- PAT甲级1049 Counting Ones (30 分):[C++题解]统计1的个数、数位统计
文章目录 题目分析 题目链接 题目分析 来源:PAT网站 分析: 以数字abcdefg这个7位数字为例,说一下本题的思路. 1)数字1在每一位出现的次数. 2)以第d位为例,第d位的取值可以分为3种情 ...
- 1049. Counting Ones (30)
题目如下: The task is simple: given any positive integer N, you are supposed to count the total number o ...
- 1049 Counting Ones (30 分)【难度: 难 / 知识点: 分治 / DP】
https://pintia.cn/problem-sets/994805342720868352/problems/994805430595731456 方法一: 找规律,分治做法. //0-999 ...
- pat1049. Counting Ones (30)
1049. Counting Ones (30) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task ...
- 【最新合集】PAT甲级最优题解(题解+解析+代码)
以下每道题均是笔者多方对比后, 思考整理得到的最优代码,欢迎交流! 共同成长哇.可以和博主比拼一下谁刷的更快~ 欢迎收藏.欢迎来玩儿 PAT题解目录 题号 标题 题解 分类 使用算法 1001 A+B ...
- PAT甲级训练合集(1-70)
本章题解跳转 考点 P1001 数字的数组表示和处理 P1002 多项式的数组表示和处理 P1003 深度优先搜素 P1004 深度优先搜素 P1005 哈希表 P1006 P1007 数组子区间求和 ...
- 刷PAT甲级的各题思路、细节以及遇到的问题记录
1001 A+B Format (20分) 因为一定会用到字符串,而string非常好用,但是用的时候一定要注意不能越界访问,否则会在运行时出现abort() has been called. 100 ...
- PAT题型分类 记录汇总
这篇博客记录了我在跟着<算法笔记>以及习题册<算法笔记 上机实践指南>刷了PAT的题目之后的一些解题方法的总结与心得. 第三章 入门模拟 1. 简单模拟 一般解题思路 这一小节 ...
- PAT甲级1042~1055
前言:距离四级考试剩23天,PAT甲级考试剩24天 对PAT甲级练习题做总结 1042 Shuffling Machine (20 分) 题目大意: 重复给出排列方式,把放在下标 i i i的牌调换到 ...
最新文章
- linux df是否分区,Linux中df命令查询磁盘信息和fdisk命令分区的用法
- python基础教程第二版下载-Python基础教程(第2版)
- 计算机安全的最后一道防线,汪文勇:灾备,数据安全的最后一道防线
- Git内部原理之深入解析Git对象
- Promise 的基本使用 与 Ajax的jQuery封装
- 天池 在线编程 推荐朋友(哈希)
- 获取显示器的唯一编号_宝马奔驰才配拥有的HUD抬头显示器,买菜车也能无损安装!...
- mysql order by rand 优化_mysql order by与by rand() 的优化经验
- 当时间管理碰上大数据,从此,悠悠时光也终不再那么漫长
- oracle数据设置为ull,Oracle _11g_使用手册_自备
- Leetcode207---课程表(逆拓扑排序)
- 同步异步线程进程的一些思考
- java读取配置文件中文乱码
- OpenGL ES glew 下载和使用
- 新手建站必看,怎么选择主机空间?
- 智能家居,在互联中看见全屋智能
- 离散数学模拟微信红包算法升级版
- CT前瞻(三):Adobe系列XD软件绘制简单的原型图与交互设计
- 在unik中,写一个Go HTTP服务器
- 用layui创建表格
热门文章
- pod setup慢的解决方法
- 开放平台鉴权以及OAuth2.0介绍
- Vue API(directives) 自定义指令
- [MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题
- vim常用命令总结 (转)
- Visual Studio Extensions for SharePoint v1.1
- spring-boot Junit4单元测试
- 解决eclipse ctrl+鼠标左键不能用
- centos安装easy_instal
- 【ZooKeeper Notes 3】ZooKeeper Java API 使用样例