1到N中1出现的次数



这个问题关键在于好好分析一些样例如:

给定123这个数,你说这个从1到123所有数字中,1出现的次数是多少?

首先我们要分析个位上1出现的次数,我们看看什么情况下个位出现1:

1,11,21,31,41,-----91,101,111,121,

因为从1-123中其实就是有多少个十就行了。

你看下从1到100个位出现1的情况:

1,11,21,31,41,51,------91。有多少个呢?

就是10*1=10个

其实就是从01,11,21,31,41,51-----91当然是10了。

就是1-100中个位有10个1.

然后再从101-123呢个位有多少个1?

就是101,111,121,有(2+1)*1=3个。

其实我们可以这样了。

那么再分析十位上出现1的情况:

1-123.

则有10-19    110-119

有多少个呢?

首先看1-100有

10-19 有10个

然后110-119 有10个

则有(1+1)*10=20个

为什么是1+1?

其实和123中10位数字有关,你想如果是103呢十位有多少个1?

就是1*10=10个

113呢?

就是1*10+3=13.

123呢?

2>1呢

(1+1)*10=20了。

于是就有规律了。

源代码:

  1. #ifndef NUMBER_OFONEINDATA_H
  2. #define NUMBER_OFONEINDATA_H
  3. #include<iostream>
  4. unsigned int numberOfOneInData(unsigned int v_data){
  5. if(v_data<=0){
  6. return 0;
  7. }
  8. unsigned int oneCount=0;
  9. unsigned int iFactor=1;
  10. unsigned int icurrentUnitNum=0;
  11. unsigned int iLowerNum=0;
  12. unsigned int iHigherNum=0;
  13. while(v_data/iFactor!=0){
  14. iLowerNum=v_data-(v_data/iFactor)*iFactor;
  15. icurrentUnitNum=(v_data/iFactor)%10;
  16. iHigherNum=v_data/(iFactor*10);
  17. switch (icurrentUnitNum)
  18. {
  19. case 0:
  20. oneCount+=iHigherNum*iFactor;
  21. break;
  22. case 1:
  23. oneCount+=iHigherNum*iFactor+iLowerNum+1;
  24. break;
  25. default:
  26. oneCount+=(iHigherNum+1)*iFactor;
  27. break;
  28. }
  29. iFactor=iFactor*10;
  30. }
  31. return oneCount;
  32. }
  33. #endif

来自为知笔记(Wiz)

时间: 2024-10-23 12:30:46

1到N中1出现的次数的相关文章

1049. Counting Ones/整数中1出现的次数(从1到n整数中1出现的次数)

The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12. Input Specification: Each inp

算法积累(字符串转换驼峰,判断一个字符串中那个字母出现次数最多,并且出现了几次)

因为算法比较烂,所以想做一下这方面的积累. 尽量能够每天学习一个新算法吧.(不过估计很悬) 好吧,今天第一个是字符串转换驼峰 直接上代码 var str = 'toupper-case'; var arr = str.split('-'); //toupper,case for (var i = 1; i < arr.length; i++) { //把除了第一个数组后面的数组的第一个值设置为大写然后大写字母和去掉第一个字符的剩下的字符进行拼合 arr[i] = arr[i].charAt(0)

计算1到100000中出现93的次数

一个同学在群上要求出计算1到100000中出现93的次数,然后,我就写脚本了. cat count.sh  #!/bin/bash sum=0 for num in {1..100000} do echo $num | grep 93 [ $? -eq 0 ] && ((sum=sum+1)) done echo "sum=$sum" 然后有同学给出答案了,秒杀我一万里 seq 1 100000 | grep 93 |wc -l 我想静静  /(ㄒoㄒ)/~~   让我

1-N中1出现的次数

/*标记1-N中1出现的次数.例如,当N等于18时,1出现的次数为2 + 9 = 11 个位数出现1的为:1,11,十位数出现1的为10-18*/public class OneNoInN { // 暴力解法 public static int solution1(int num) { // 异常处理 if (num < 1) return 0; // 标记变量count int count = 0; // 计算没个数中的1的个数,然后加起来,时间复杂度为O(nlogn) for (int i

《找出1到正整数N中出现1的次数》

编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果:而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对称轴,其左边的所有数字作为其最高位,其右边的数字作为其最低位:当然若此位置已处于最低位或最高位,那么它对应的最低位或最高位置0),与它们有一个可求出1的固定的关系式(一个数各个位置上的数分离后,它们都对应着各个位置的基准,例如个位上的数对应的基准为1,以此类推即可),即若此位置上的数字为0,则在此位置上出现1的个数为最高位乘以基准:若为1,则等于

[Jobdu] 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 输入: 输入有多组数据,每组测试数据为一行. 每一行有两个整数a,b(

LoadRunner中Action的迭代次数的设置和运行场景中设置

LoadRunner中Action的迭代次数的设置和运行场景中设置 LoadRunner是怎么重复迭代和怎么增加并发运行的呢? 另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的. --参数化时,在select  next row选择unique,update value on选择 each occurence, 1. 迭代跟虚拟用户数没什么必然联系 迭代是这样的: 迭代1次   迭代2次  迭代3次 用户1     X1        

整数中1出现的次数(从1到n整数中1出现的次数)

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 思路1:针对这个问题,我们可以有一个最普遍的算法,就是直接计算每一个数中的1出现的次数. public int NumberOf1Between1AndN_Solution(int n) { int count =

找出一个字符串中最长重复次数的子字符串,并计算其重复次数

原题 找出一个字符串中最长重复次数的子字符串,并计算其重复次数.例如:字符串"abc fghi bc kl abcd lkm abcdefg",并返回"abcd"和2. 我的思路 为了方便表述,我们使用变量src作为原字符串,sub_str作为子字符串. 由于题目要求寻找至少重复2次的最长的子字符串,重点在于最长的子字符串,而不在于重复的最多次数.因此我们可以从长度最长的字符串入手,计算其重复次数.只要重复达到2次,即可返回该字符串. 显然长度最长的子字符串就是原串

技巧之C#统计字符串中字符出现的次数(转)

方法1.自定义类 class CharNum { private char c; private int num; public char C { get { return c; } } public int Num { get { return num; } set { num = value; } } public CharNum(char ch) { this.c = ch; this.num = 1; } } static void Main(string[] args) { /* */