从1到n整数中1出现的次数(有疑问)
来源:互联网 发布:linux x86 x64区别 编辑:程序博客网 时间:2024/06/18 11:54
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12, 1一共出现了5次。
方法1:累加1到n中每个整数1出现的次数。每次通过对10求余数判断整数的个位数字是不是1。如果这个数字大于10,除以10之后再判断个位数字是不是1。
int NumberOf1Between1AndN(unsigned int n){ int number = 0; for (unsigned int i = 1; i <= n; ++i){ number += NumberOf1(i); } return number;}int NumberOf1(unsigned int n){ int number = 0; while (n){ if (n % 10 == 1){ number++; } n = n / 10; } return number;}
方法2:以21345为例。
- 把从1到21345的所有数字分为两段,一段是从1到1345,另一段是从1346到21345。
- 从1346到21345的数字中:
- 1出现在10000~19999这10000个数字的万位中,一共出现了10000个(1出现在10000~12345的万位的次数是2346次,即除去最高数字后剩下的数字再加上1)。
- 下面分析1出现在除最高位之外的其他四位数中的情况。由于最高位是2,可以把1346~21345分成两段,1346~11345和11346~21345。每一段剩下的4位数字中,选择其中一位是1,其余三位可以在0~9这10个数字中任意选择,因此根据排列组合原则,总共出现的次数是
2×103=2000 次。
- 从1~1345可以递归求得。
int NumberOf1Between1AndN(int n){ if (n <= 0){ return 0; } char strN[50]; sprintf(strN, "%d", n); return NumberOf1(strN);}int NumberOf1(const char* strN){ if (!strN || *strN < '0' || *strN > '9' || *strN == '\0'){ return 0; } int first = *strN - '0'; unsigned int length = static_cast<unsigned int>(strlen(strN)); if (length == 1 && first == 0){ return 0; } if (length == 1 && first > 0){ return 1; } //假设strN是“21345” //numFirstDigit是数字10000~19999的第一位中的数目 int numFirstDigit = 0; if (first > 1){ numFirstDigit = PowerBase10(length - 1); } else if (first == 1){ numFirstDigit = atoi(strN + 1) + 1; } //numOtherDigits是1346~21345除了第一位之外的数位中的数目 int numOtherDigits = first * (length - 1) * PowerBase10(length - 2); //numRecursive是1~1345中的数目 int numRecursive = NumberOf1(strN + 1); return numFirstDigit + numOtherDigits + numRecursive;}int PowerBase10(unsigned int n){ int result = 1; for (unsigned int i = 0; i < n; ++ i){ result *= 10; } return result;}
测试用例:
- 功能测试(输入5、10、55、99等)
- 边界值测试(输入0、1等)
- 性能测试(输入较大的数字如10000、21235等)
0 0
- 从1到n整数中1出现的次数(有疑问)
- 整数中1出现的次数(从1到n整数中1出现的次数)
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到 n整数中1出现的次数
- 约束及修改数据表
- pip安装django失败
- [LeetCode]Palindrome Linked List
- Linux命令备忘实例(14)——sed
- 对连接数据库的简单升级
- 从1到n整数中1出现的次数(有疑问)
- 【UIKit-110-7】#import <UIKit/UITableView.h>提前注册
- Xcode 6.3.1Mac版 V6.4.Beta3免费下载
- yum提示another app is currently holding the yum lock;waiting for it to exit
- C语言中可变长参数使用
- 韩国美女连连看核心算法
- 单例模式建立工具类
- 新手必须知道的13个Xcode小技巧
- hiho一下 第五十九周