求1~n直接1出现的次数

参考前人的统计思想:分别统计个、十、百、、、亿等第N位上1出现的次数。

如ABCDE,在统计D位1出现的次数时,用D做分割符,ABC为Before,E为After。

分情况考虑:(n为D的length-1)

当D = 0 时,count = Before * 10^n ;

当D = 1 时,count = Before * 10^n + After;

当D > 1 时,count = (Before + 1)*10^n;

例如:

  19X8

统计X上1的次数:

1)X = 0 ,即1908 X为1的数有001x~181x,x取0~9则19为Before,8为After

此时count = 19 * 10^1 ;

2)X = 1 ,即1918 X为1的数有001x~181x,x取0~9;另外,1910~1918,则19为Before,8为After

此时count = 19 * 10^1 + (8 + 1);

3)X > 1 ,如1928 X为1的数有001x~191x,x取0~9则19为Before,8为After

此时count = (19 + 1) * 10^1 ;

特别当X在最左端时Before 为 0,最右端时After 为0

#include <stdio.h>

int Count1(int n)
{
    int count = 0,//1出现总次数
    bitCount = 0,//某位1出现次数
    base = 1,//基数
    before = n,after = 0,  //从最右开始,则Before = n,After = 0
    bitN = 0;//第N位数
    while(before)//向左移,还有数时循环
    {
        after = n % base;
        before = n / (base * 10);
        bitN = (n / base) % 10;
        if(bitN > 1)
        {
            bitCount = (before + 1) * base;
        }
        else if(bitN == 0)
        {
            bitCount = (before) * base;
        }
        else
        {
            bitCount = (before) * base + (after + 1);
        }
        base *= 10;
        count += bitCount;
    }
    return count;
}

int main() {
   int n = 121;
   printf("%d\n",Count1(n));
   return 0;
}
时间: 2024-10-25 21:44:25

求1~n直接1出现的次数的相关文章

求一个字符串中连续出现的次数最多的子串

求一个字符串中连续出现的次数最多的子串.例如字符串“abababc”,最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:abababcbababcababcbabcabcbcc可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次

Hash——字符串匹配(求s1在s2中出现的次数)

题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A  中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN 样例输出: 1 3 0 首先要知道什么是字符串hash(滚动哈希): 单哈希可以O(m)的时间计算长度为m的字符串的哈希值,但对于本题,总的时间复杂度没有改观.时间会爆. 这时我们就需要一个叫做滚动哈希的优化技巧.

KMP模版 &amp;&amp; KMP求子串在主串出现的次数模版

int next[MAX_LEN]; void creat_next(char *S, int Sn) { int k, q; next[0] = 0; for(k=0, q=1; q<Sn; q++){ while(k>0 && S[k]!=S[q]) k = next[k-1]; if(S[k] == S[q]){ k++; } next[q] = k; } } bool Judge(char *S, char *T, int Sn, int Tn)//S是子串,T是主串

JAVA常见算法题(三十三)---求子串在字符串中出现的次数

计算某字符串中子串出现的次数. public static void main(String[] args) { String s1 = "adcdcjncdfbcdcdcd"; String s2 = "cd"; count(s1, s2); } public static void count(String str1, String str2) { int count = 0; if (str1.equals("") || str2.equa

js 求字符串某个字母出现的最大次数

<!DOCTYPE HTML><html><head>    <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Max_val</title> </head><body>    <div class="">    </div> &

hdoj 4552 怪盗基德的挑战书【求前缀在字符串中出现的次数之和】

怪盗基德的挑战书 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 990    Accepted Submission(s): 478 Problem Description “在树最美丽的那天,当时间老人再次把大钟平均分开时,我会降临在灯火之城的金字塔前,带走那最珍贵的笑容.”这是怪盗基德盗取巴黎卢浮宫的<蒙娜丽莎的微笑>这幅画时,挑

任意输入一串字符串,求该字符串中字符的出现次数并打印出来,如输入“bcaba”输出:b 2 c 1 a 2

前言:其实我还是有点不懂,有点郁闷了,算了直接把代码放上去把. 方法一: Scanner input=new Scanner(System.in); System.out.println("请输入一个字符"); String str=input.next(); char[] strChar=str.toCharArray(); //声明集合,把之存在集合中 Map<Character,Integer> map=new HashMap<>(); for(int i

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

hdoj 3635 Dragon Balls【并查集求节点转移次数+节点数+某点根节点】

Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4384    Accepted Submission(s): 1673 Problem Description Five hundred years later, the number of dragon balls will increase unexpecte