整数中1出现的次数(从1到n整数中1出现的次数)
2015-09-02 16:31
357 查看
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。#include <iostream> using namespace std; int Power10Base(int length) { int result =1; for(int i =0 ;i < length;i++) result *= 10; return result; } int NumberOf1(char* str) { if(!str || *str < '0' || *str > '9' || str == '\0') return 0; int first = *str -'0'; int length = strlen(str); if(first == 0 && length == 1) return 0; if(first == 1 && length == 1) return 1; int NumberOfFirst = 0; if(first > 1) NumberOfFirst = Power10Base(length -1); else if(first == 1) NumberOfFirst = atoi(str + 1) + 1; int NumberOfOthers = first * (length -1) * Power10Base(length -2); int NumberRecurse = NumberOf1(str + 1); return (NumberOfFirst + NumberOfOthers + NumberRecurse); } int NumberOf1Between1AndN(unsigned int n) { if(n < 0) return 0; char str[50]; sprintf(str,"%d",n); return NumberOf1(str); }
// ====================测试代码==================== void Test(char* testName, int n, int expected) { if(testName != NULL) printf("%s begins: \n", testName); if(NumberOf1Between1AndN(n) == expected) printf("Solution2 passed.\n"); else printf("Solution2 failed.\n"); printf("\n"); } void Test() { Test("Test1", 1, 1); Test("Test2", 5, 1); Test("Test3", 10, 2); Test("Test4", 55, 16); Test("Test5", 99, 20); Test("Test6", 10000, 4001); Test("Test7", 21345, 18821); Test("Test8", 0, 0); } int main(int argc, char* argv[]) { Test(); return 0; }
相关文章推荐
- Win7脱机文件夹同步取消与功能屏蔽
- sql根据年月分组
- NYOJ 53 不高兴的小明
- Gearman1.1.12安装与启动
- Java____Eclipse下JUnit单元测试(中级)
- oracle 表空间查看
- iOS开发日记14-NSFileManager(沙盒和清除缓存)
- 如何将数组展开!
- 埃拉托斯特尼筛法求素数表
- 通过unicorn Web Server加速Rails Server的速度
- EditText限制输入金额(价格)格式
- 以此作为自己 python blog 里程的开始
- iOS 内存管理 (有ARC)
- Word Break II 字符串分割 动态规划+DFS
- 淘宝核心系统团队的产品线
- 旋转链表,递归实现
- Memcached之代理服务magent(8)
- ajax请求json数据案例
- Nodejs express中创建ejs项目
- PAT Advanced 1012