【编程马拉松】【004-包含一】
来源:互联网 发布:asp.net vb 教程 编辑:程序博客网 时间:2024/05/16 07:52
【编程马拉松算法目录>>>】
【004-包含一】【工程下载>>>】
1 题目描述
NowCoder总是力争上游,凡事都要拿第一,所以他对“1”这个数情有独钟。爱屋及乌,他也很喜欢包含1的数,例如10、11、12……。你能帮他统计一下有多少个包含1的正整数吗?
1.1 输入描述:
输入有多组数据,每组数据包含一个正整数n,(1≤n≤2147483647)。
1.2 输出描述:
对应每组输入,输出从1到n(包含1和n)之间包含数字1的正整数的个数。
1.3 输入例子:
191020
1.4 输出例子:
11211
2 解题思路
假设有数字
先考虑
-
-
-
所以
P(n)={19∗P(n−1)+10n−1n=0n>0
再考虑
第一种:
第二种:
-
-
则有
第三种:
-
-
-
-
则有
综合有:
当
F(n)=1
当
F(n)=⎧⎩⎨F(n−1)P(n−1)+X(n−1)+1(xn−1)P(n−1)+10n−1+F(n−1)xn=0xn=1xn>1
3 算法实现
import java.util.Scanner;/** * Author: 王俊超 * Time: 2016-05-06 17:52 * CSDN: http://blog.csdn.net/derrantcm * Github: https://github.com/Wang-Jun-Chao * Declaration: All Rights Reserved !!! */public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { int n = scanner.nextInt(); System.out.println(countOne(n)); } scanner.close(); } /** * 【方法一】 * 计算[1-n]中包含数字1的数字个数 * * @param n 最在范围 * @return 包含数字1的数字个数 */ private static int countOne(int n) { int countedN = 0; int result = 0; // 从右向左分析n的每一位;for循环中:i 表示分析到了哪一位,i=1表示个位,i=10表示十位,以此类推; // onesPerI 表示从0到i-1含有1的数的个数,0,1,19 ...; // cur 是目前分析的那一位的数值; // 举个例子: f(m,n) 表示从m到n,含有1的数字的个数。 // f(1,500) = f(1, 99)+f(100, 199)+f(200, 299)+(300, 399)+f(400, 499) // f(1, 99) = f(200, 299) = f(300, 399) = f(400, 499) // f(100, 199) = 100 for (int i = 1, onesPerI = 0, cur; n != 0; onesPerI = onesPerI * 9 + i, i *= 10, n /= 10) { // 当前数位的数值 cur = n % 10; if (cur == 0) { continue; } else if (cur == 1) { // onesPerI表示[1, i-1]含有1的个数,countedN表示比 result = onesPerI + countedN + 1; } else { result += (cur - 1) * onesPerI + i; } // 表示比第i位以及比第i位低的各位的数值,比如abcdef,现在处理万位,那么countN就是bcdef countedN += cur * i; } return result; }}
4 测试结果
5 其它信息
因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】。
- 【编程马拉松】【004-包含一】
- nowcoder马拉松--包含一
- 【编程马拉松】【006-统计一】
- 【编程马拉松】【019-一笔画】
- 编程马拉松总结
- 换零钱---编程马拉松
- 鹊桥相会---编程马拉松
- 编程马拉松:电话号码
- 【编程马拉松算法目录】
- 【编程马拉松】【012-Hero】
- 编程马拉松17C
- 我的编程马拉松
- 人工智能编程马拉松
- 编程马拉松----走迷宫
- 马拉松(一)
- 2013腾讯编程马拉松初赛
- 【编程马拉松】【001-NowCoder猜想】
- 【编程马拉松】【002-分遗产】
- 实习入职第九天:android中的seekbar加了图片后,拖动球显示不全问题
- hdoj2087剪花布条(大字符串截取小字符串)
- 决策支持系统复习资料
- poj1182食物链
- MJRefresh的用法
- 【编程马拉松】【004-包含一】
- mysql 找不到或无法加载已注册的 .Net Framework Data Provider。
- disque基本流程介绍
- 四种可视化技术对比
- PAT 1002. A+B for Polynomials (25)
- 完全背包问题
- ZZULIOJ 1430 1435
- Android应用组件Activity
- [Vulkan教程] 二: Image & Buffer & 内存管理