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相关推荐

  1. PAT甲级1049 Counting Ones (30 分):[C++题解]统计1的个数、数位统计

    文章目录 题目分析 题目链接 题目分析 来源:PAT网站 分析: 以数字abcdefg这个7位数字为例,说一下本题的思路. 1)数字1在每一位出现的次数. 2)以第d位为例,第d位的取值可以分为3种情 ...

  2. 1049. Counting Ones (30)

    题目如下: The task is simple: given any positive integer N, you are supposed to count the total number o ...

  3. 1049 Counting Ones (30 分)【难度: 难 / 知识点: 分治 / DP】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805430595731456 方法一: 找规律,分治做法. //0-999 ...

  4. pat1049. Counting Ones (30)

    1049. Counting Ones (30) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task ...

  5. 【最新合集】PAT甲级最优题解(题解+解析+代码)

    以下每道题均是笔者多方对比后, 思考整理得到的最优代码,欢迎交流! 共同成长哇.可以和博主比拼一下谁刷的更快~ 欢迎收藏.欢迎来玩儿 PAT题解目录 题号 标题 题解 分类 使用算法 1001 A+B ...

  6. PAT甲级训练合集(1-70)

    本章题解跳转 考点 P1001 数字的数组表示和处理 P1002 多项式的数组表示和处理 P1003 深度优先搜素 P1004 深度优先搜素 P1005 哈希表 P1006 P1007 数组子区间求和 ...

  7. 刷PAT甲级的各题思路、细节以及遇到的问题记录

    1001 A+B Format (20分) 因为一定会用到字符串,而string非常好用,但是用的时候一定要注意不能越界访问,否则会在运行时出现abort() has been called. 100 ...

  8. PAT题型分类 记录汇总

    这篇博客记录了我在跟着<算法笔记>以及习题册<算法笔记 上机实践指南>刷了PAT的题目之后的一些解题方法的总结与心得. 第三章 入门模拟 1. 简单模拟 一般解题思路 这一小节 ...

  9. PAT甲级1042~1055

    前言:距离四级考试剩23天,PAT甲级考试剩24天 对PAT甲级练习题做总结 1042 Shuffling Machine (20 分) 题目大意: 重复给出排列方式,把放在下标 i i i的牌调换到 ...

最新文章

  1. linux df是否分区,Linux中df命令查询磁盘信息和fdisk命令分区的用法
  2. python基础教程第二版下载-Python基础教程(第2版)
  3. 计算机安全的最后一道防线,汪文勇:灾备,数据安全的最后一道防线
  4. Git内部原理之深入解析Git对象
  5. Promise 的基本使用 与 Ajax的jQuery封装
  6. 天池 在线编程 推荐朋友(哈希)
  7. 获取显示器的唯一编号_宝马奔驰才配拥有的HUD抬头显示器,买菜车也能无损安装!...
  8. mysql order by rand 优化_mysql order by与by rand() 的优化经验
  9. 当时间管理碰上大数据,从此,悠悠时光也终不再那么漫长
  10. oracle数据设置为ull,Oracle _11g_使用手册_自备
  11. Leetcode207---课程表(逆拓扑排序)
  12. 同步异步线程进程的一些思考
  13. java读取配置文件中文乱码
  14. OpenGL ES glew 下载和使用
  15. 新手建站必看,怎么选择主机空间?
  16. 智能家居,在互联中看见全屋智能
  17. 离散数学模拟微信红包算法升级版
  18. CT前瞻(三):Adobe系列XD软件绘制简单的原型图与交互设计
  19. 在unik中,写一个Go HTTP服务器
  20. 用layui创建表格

热门文章

  1. pod setup慢的解决方法
  2. 开放平台鉴权以及OAuth2.0介绍
  3. Vue API(directives) 自定义指令
  4. [MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题
  5. vim常用命令总结 (转)
  6. Visual Studio Extensions for SharePoint v1.1
  7. spring-boot Junit4单元测试
  8. 解决eclipse ctrl+鼠标左键不能用
  9. centos安装easy_instal
  10. 【ZooKeeper Notes 3】ZooKeeper Java API 使用样例