#include <iostream>
using namespace std;
/**
* @author: jiq
* ---问题描述:
* 给定一个正整数n,要求统计1-n的所有整数中1出现的次数。
* 比如11,那么1-11总共出现三次1。
* (from the Beauty of Programming)
*
* --- 分析
* 很明显最直接的方法就是依次循环每一个数,然后对1的次数累加。
* 不过更好的方法是找规律。但是什么样的规律最简单?
*
* 可以将问题表示为:
* 1-n所有个位是1的数字个数,
* 1-n所有十位是1的数字个数,
* 1-n所有百位是1的数字个数,...
* 这样1-n所有整数1出现的次数 = 上面的和
*
* 那么给定一个数n,其1-n所有数字中x位是1的数字有多少个呢?
* 我们就是要找这个规律,以123为例子:
* 1-123个位是1的数字有:1,11,21...,91,101,111,121共13个
* 1-123十位是1的数字有:10,11,12...19,110,111,112...119共20个
* 1-123百位是1的数字有:100,101,102...123共24个。
* 所以1-123所有数字中1出现的次数是13+20+24 = 57个。
* 有什么规律呢?
*
* ---结论(规律):
* 对于数字n = abxcd。
* (1) 若n的x位是0,那么1-n所有数字x位是1的数字总共有:ab*x个;
* (2) 若n的x位是1,那么1-n所有数字x位是1的数字总共有:ab*x+cd+1个;
* (3) 若n的x位是2-9,那么1-n所有数字x位是1的数字总共有:(ab+1)*x个;
* 注意:其中x可以为个位,十位,百位...对应值为1,10,100...
*
* ---编程:
* 至此,便可以依次循环数字n的每一位,根据n的当前位的值
* 用公式计算出1-n所有数字中第当前位是1的数字有多少个。
*
*/
long cal_1_numbers(int n){
int factor = 1; //从个位开始
int count = 0; //1的次数
int highNum = 0;//当前位前面的数值
int lowNum = 0; //当前位后面的数值
int currNum = 0;//当前位的数值
//开始循环n的每一位,计算1-n中所有当前位是1的数字个数
while(n/factor != 0){
highNum = n / (factor * 10);
lowNum = n - (n/factor)*factor;
currNum = n/factor%10;
//开始分情况计算
switch(currNum){
case 0:
count += highNum * factor;
break;
case 1:
count += highNum * factor + (lowNum + 1);
break;
default:
count += (highNum + 1) * factor;
break;
}
factor *= 10; //个十百...分别对应1,10,100
}
return count;
}
int main(void){
cout<<"cal_1_numbers(13) = "<<cal_1_numbers(13)<<endl;
cout<<"cal_1_numbers(20) = "<<cal_1_numbers(20)<<endl;
cout<<"cal_1_numbers(123) = "<<cal_1_numbers(123)<<endl;
cout<<"cal_1_numbers(1203) = "<<cal_1_numbers(1203)<<endl;
return 0;
}
分享到:
相关推荐
如果我们知道长整型数字的大小不超过32位(即数值范围在0-2^32-1之间),我们可以利用位掩码和位计数算法来统计每个数字的出现次数。对于更大的数字,我们需要多次迭代,每次处理一部分位。 第三种方法是使用...
这个程序能够读取txt格式的英文文档,并统计其中每个单词出现的次数,从而帮助我们理解文本的主要内容和主题。 首先,我们需要理解词频统计的基本概念。词频统计是指在给定文本中计算每个单词出现的频率,它对于...
计算从1~n的奇数序列,统计3出现的次数,源于网络流传的一个段子。 实际上这题是Leetcode中一个题目的变种,即1~n中,1出现的次数。 该代码主要考虑缩减时间复杂性。其实原理与这个题目相同,稍作变化即可,把1换成...
统计数字问题 一本书的页码从自然数1 开始顺序...程序运行结束时,输出有10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。 Sample Input 11 Sample Output 1;4;1;1;1;1;1;1;1;1(竖着的!)
* 正则统计字符串出现次数 * * @param source * @param regexNew * @return int */ public static int finder(String source, String regexNew) { String regex = "[a-zA-Z]+"; if (regexNew != ...
本文将深入探讨S7-200SMART中的位状态变址读取、写入以及如何统计N个字节中1或0的数量。 一、位的变址读取 在S7-200SMART PLC中,位操作是基础的控制手段。位的变址读取允许我们读取输入、输出或其他存储区的单个位...
计算从1到n(一个正数)中,x(一个数字)出现的次数。
在Java编程中,统计字符串中每个字符出现的次数是一个常见的任务,特别是在面试或笔试中作为考察点。这个任务可以通过使用HashMap来实现,因为HashMap提供快速的查找和插入操作,适合处理这种计数的问题。以下是一个...
在本题目中,我们需要编写一个C语言程序,用于计算从1到给定正整数N之间所有整数中数字"1"出现的总次数。这是一个典型的字符串处理和数学计算问题,涉及到了数字转换、字符串遍历以及计数算法。下面我们将深入探讨这...
k++) { // 循环1到100,统计每个整数出现的次数 int count = 0; for (int j = 0; j ; j++) { if (k == array[j]) { count++; // 如果找到匹配,则增加计数器 } } if (count != 0) { // 只输出出现次数不为0...
3. **字符计数**:利用 `for` 循环遍历整个字符串,并通过条件判断和ASCII码的特性,统计每个指定字母的出现次数。 4. **输出结果**:最后,再次使用 `for` 循环,输出每个字母及其出现次数。 通过以上分析可以看出...
1. **暴力法**:遍历整个数组,统计目标数字的出现次数。这种方法简单直观,但效率较低,时间复杂度为O(n)。 2. **排序+二分查找**:首先对数组进行排序,然后通过二分查找定位目标数字,并统计其出现次数。这种方法...
`counts`字典将每个字母映射到其在文本中出现的次数。 统计完成后,我们需要按照字母出现次数的高低进行排序。在Python中,可以使用`sorted()`函数配合`lambda`表达式实现这个目标: ```python sorted_counts = ...
本主题关注的是如何查找一个字符串中出现重复次数最多的字符。这是一个典型的字符串处理问题,对于理解字符串操作和优化算法能力的提升非常有帮助。 首先,我们要明确问题的目标:给定一个字符串,找出其中出现频率...
以上就是使用Qt实现统计文本中出现最高频次字符的基本步骤和相关知识点。通过这个实例,我们可以学习到Qt的UI设计、事件处理、字符串操作、数据结构(如`QMap`)以及数据模型的排序方法。希望这个指南对你在Qt编程中...
问题描述: ...f(n) = 10f(n-1)+10^(n-1)………………… (n>1) f(n) =1……………………………………… (n=1) 由此可知,f(n)=n*10^(n-1)。 据此,可从高位向低位进行统计,再减去多余的0的个数即可。
【输入形式】 从标准输入读取输入。第一行只有一个数字N(1≤N≤10000),代表整数的个数。...-1 20 0 300 【输出样例】 0 【样例说明】 输入6个整数,其中出现次数最多的是0,共出现两次。