1049. Counting Ones (30)

The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.

Input Specification:

Each input file contains one test case which gives the positive N (<=230).

Output Specification:

For each test case, print the number of 1's in one line.

Sample Input:

12

Sample Output:

5

题目意思很好理解,数小于等于n的1的个数,注意不要漏掉11中的两个1,有几个1都要算上
本题使用动态规划结题,分析可知,给定第一个数,剩下的就可以递推得到了,例如 n = 623
可知, 比623小的数中,可以是0, 1, 2, 3, 4, 5开头,其中0开头也就是比23小的数字 6开头: 由于百位不会出现比1了,所以答案就是f(99)
5开头: 同理,f(99)
.
.
.
1开头: 这个要注意除了f(99)外,还需要加上100个开头的1
0开头: f(99) 所有加和就是答案,综合分析可知,如果n首位first大于1, 除去首位后的数字是k, f(n) = first * f(99..9) + f(k) + 10..00
若n首位等于1, 除去首位数字是k, f(n) = f(k) + f(99..9) + k + 1 上代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std; long long ex[];

//计算n的最高10次幂, 比如123 最高为100, 也就是 10 ^ 2, e = 2
int exp(long long n)
{
int e = ;
while(n > )
{
e += ;
n /= ;
}
return e - ;
}

//不知道为什么,cmath自带的函数pow(10, 2) = 99 所以自己写了一个pow函数
long long pow(int n)
{
int prod = ;
for(int i = ; i < n; i++)
{
prod *= ;
}
return prod;
} long long f(long long n)
{
if(n == )
return ;
if(n < )
return ;
int e = exp(n); long long e10 = pow(e);
   
  //如果是除了首位全都是0, 那么直接返回计算过的结果
if(n % e10 == )
return ex[e] + ; int first = n / e10; if(first == )
return f(n % e10) + (n % e10 + ) + ex[e];
return f(n % e10) + e10 + first * ex[e]; }
int main()
{
long long n;
scanf("%d", &n); int e = exp(n);
ex[] = ;
  //预先算出f(99..9)的数组,以后不需要重新计算
for(int i = ; i <= e; i++)
{
ex[i] = * (ex[i - ]) + pow(i - );
} printf("%d", f(n)); return ;
}

此题知道, PAT不能使用%I64d读入,否则会出格式错误, 也不能使用__int64的类型,以后要注意大数使用 long long

 

PAT 1047的更多相关文章

  1. PAT 1047 Student List for Course[一般]

    1047 Student List for Course (25 分) Zhejiang University has 40,000 students and provides 2,500 cours ...

  2. 浙大 pat 1047题解

    1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  3. PAT 1047 编程团体赛(代码)

    1047 编程团体赛(20)(20 分) 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出 ...

  4. PAT——1047. 编程团体赛

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  5. PAT 1047. 编程团体赛(20)

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  6. PAT 1047 编程团体赛

    https://pintia.cn/problem-sets/994805260223102976/problems/994805277163896832 编程团体赛的规则为:每个参赛队由若干队员组成 ...

  7. PAT 1047. Student List for Course

    Zhejiang University has 40000 students and provides 2500 courses. Now given the registered course li ...

  8. PAT 解题报告 1047. Student List for Course (25)

    1047. Student List for Course (25) Zhejiang University has 40000 students and provides 2500 courses. ...

  9. PAT乙级-1047. 编程团体赛(20)

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

随机推荐

  1. linux网络编程1 最简单的socket编程

    下面是socket编程的服务器端 先看一个图,1 #include<stdio.h> #include<stdlib.h> #include<string.h> # ...

  2. 设置debian的静态IP

    欲设置的信息: IP地址:198.9.146.131 子网掩码:255.255.255.0 网关:198.9.146.254 DNS:198.9.9.1 198.9.9.2 首先编辑/etc/netw ...

  3. 移动端利用rem实现自适应布局

    好久没有写博客了,刚好说说最近遇到的移动端布局问题吧. 本来一直是觉得我的页面布局能力还是不错的,当然,是相对于较基础的来说还是不错的.不过,自己写的案例终归是跟实际开发有区别的,自己写案例的是觉得这 ...

  4. JVM 体系结构

    JVM 是一种抽象的计算机,基于堆栈架构,它有自己的指令集和内存管理,是 Java 跨平台的依据,JVM解释执行字节码,或将字节码编译成本地代码执行.Java 虚拟机体系结构如下: Class Fil ...

  5. 使用python操作InfluxDB

    环境: CentOS6.5_x64InfluxDB版本:1.1.0Python版本 : 2.6 准备工作 启动服务器 执行如下命令: service influxdb start 示例如下: [roo ...

  6. 1682: [Usaco2005 Mar]Out of Hay 干草危机

    1682: [Usaco2005 Mar]Out of Hay 干草危机 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 391  Solved: 258[ ...

  7. Android 一个改善的okHttp封装库

    膜拜一下~ 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49734867: 本文出自:[张鸿洋的博客] 一.概述 之前写了篇A ...

  8. [lua] mac上如何编译snapshot(检测Lua中的内存泄露)

    最近我们的unity手游频繁闪退,只要进入战斗场景,之后一段时间就会闪退,如果是在unity编辑器中则会报出not enough memory的错误!猜测应该是有内存泄漏: 由于我们使用了tolua, ...

  9. [No0000C1]Excel 删除空白行和空白列VBA代码

    在exce中删除空行和空列的方法有很多,相对而言删除空行较为简单,只需进行筛选,将空白行筛选出来,删除即可,但要删除空列比较困难.因为你不能按列进行筛选删除.Excel中没有这个功能.当然你可以用另外 ...

  10. 【js数据结构】栈解决佩兹糖果盒问题

    现实生活中栈的一个例子是佩兹糖果盒. 想象一下你有一盒佩兹糖果, 里面塞满了红色. 黄色和白色的糖果, 但是你不喜欢黄色的糖果. 使用栈( 有可能用到多个栈) 写一段程序, 在不改变盒内其他糖果叠放顺 ...