【剑指Offer面试题】 九度OJ1373:整数中1出现的次数(从1到n整数中1出现的次数)
2015-08-08 20:51
686 查看
题目链接地址:
http://ac.jobdu.com/problem.php?pid=1373
题目描述:
亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
输入:
输入有多组数据,每组测试数据为一行。
每一行有两个整数a,b(0<=a,b<=1,000,000,000)。
输出:
对应每个测试案例,输出a和b之间1出现的次数。
样例输入:
0 5
1 13
21 55
31 99
样例输出:
1
6
4
7
对于每一位来说可以把一个数拆分为 前面( begin)+中间( middle)+后面(end )
1234的百位 = 1+2+34
规律:
http://ac.jobdu.com/problem.php?pid=1373
题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
时间限制:1 秒内存限制:32 兆特殊判题:否提交:1988解决:501题目描述:
亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
输入:
输入有多组数据,每组测试数据为一行。
每一行有两个整数a,b(0<=a,b<=1,000,000,000)。
输出:
对应每个测试案例,输出a和b之间1出现的次数。
样例输入:
0 5
1 13
21 55
31 99
样例输出:
1
6
4
7
思路分析:
统计整数n中的每个十进制位中1出现的次数,再累加起来。对于每一位来说可以把一个数拆分为 前面( begin)+中间( middle)+后面(end )
1234的百位 = 1+2+34
规律:
代码:
/********************************* 【剑指Offer面试题】 九度OJ1373:整数中1出现的次数(从1到n整数中1出现的次数) Author:牧之丶 Date:2015年 Email:bzhou84@163.com **********************************/ #include <stdio.h> #include <stdlib.h> #include <string> #include <cstring> #include <math.h> #include <stack> #include <vector> #include <queue> #include <iostream> #include<algorithm> #include <map> #include <queue> using namespace std; long long fun(long long n) { if(n < 1) return 0; long long count = 10, num = 0, begin, middle, end,m; begin = n; middle = 0; end = 0; while(begin) { begin = n/count; m = n%count; middle = m/(count/10); end = m%(count/10); if(middle > 1) num = num + (count/10) * (begin+1); else if(middle == 1) num = num + (count/10) * begin + (end + 1); else num = num + (count/10) * begin; count = count * 10; } return num; } int main() { long long n,m; while(scanf("%lld %lld",&n,&m)!=-1) if(n>m) printf("%lld\n",fun(n) - fun(m-1)); else printf("%lld\n",fun(m) - fun(n-1)); return 0; } /************************************************************** Problem: 1373 Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
相关文章推荐
- 剑指Offer面试题30(java版):最小的k个数
- 黑马程序员——Java中的一个关于参数传递的小问题
- 20个高级Java面试题汇总
- 黑马程序员——Java基础---IO(一)---IO流概述、字符流
- java---面试题---.java"源文件中可以包括多个类(不是内部类)
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 如何在面试中发现优秀程序员
- 黑马程序员--IO流总述
- GNU Binary Utilities的笔记
- 黑马程序员-----Java基础-----数组!
- mysql基本语法及面试常见问题
- 程序员面试题目:Cracking the coding interview 分析与解答
- java面试基础120题及答案(无编程题)
- 【面试题】在一个含有n个元素的集合中随机取一个数
- 大学生应对面试宝典(电话、现场面试)
- 程序员面试宝典(第四版)——读书笔记-2、第六章:预处理、const与sizeof
- 黑马程序员——Java基础语法---数组
- 黑马程序员——20,IO流,FileWriter,FileReader
- 程序员面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念
- 剑指offer面试题46:求1+2+...+n