找1到n所有整数出现1的个数

编程之美2.4

n=12时,1,11,12这3个数包含1,所以1的个数是5.

Line 9是为了防止factor溢出。

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 using namespace std;
 5
 6 int countOne(int n) {
 7     int ans = 0;
 8     int factor = 1;
 9     while (n / factor >= 10) { // avoid overflow
10         int high = n / factor / 10;
11         int low = n % factor;
12         int current = (n / factor) % 10;
13         if (current == 0) {
14             ans += high * factor;
15         } else if (current == 1) {
16             ans += high * factor + low + 1;
17         } else {
18             ans += (high + 1) * factor;
19         }
20         factor *= 10;
21     }
22     if (n / factor == 1) ans += (n % factor) + 1;
23     else if (n / factor != 0) ans += factor;
24     return ans;
25 }
26
27 int bruteForce(int n) {
28     int ans = 0;
29     for (int i = 1; i <= n; ++i) {
30         int tmp = i;
31         while (tmp) {
32             if (tmp % 10 == 1) ans++;
33             tmp /= 10;
34         }
35     }
36     return ans;
37 }
38
39 int main() {
40     srand(time(NULL));
41
42     for (int i = 0; i < 100; ++i) {
43         int n = rand() % 9999999;
44         int c1 = countOne(n);
45         int c2 = bruteForce(n);
46         if (c1 != c2) {
47             cout << c1 << " " << c2 << " " << n << endl;
48         }
49     }
50     return 0;
51 }
时间: 2024-10-10 02:03:03

找1到n所有整数出现1的个数的相关文章

编程之美 找出符合条件的整数

好不容易把内容看懂~ 最主要的一句话:只需要将10k%N的结果与余数信息数组里非空的元素相加,再去模N,看看会不会出现新的余数~ 时间太紧迫~先把自己写的代码贴上,以后再详解 1 int FindMin(int N) 2 { 3 if(N <= 1) 4 return N; 5 6 int* A = new int[N];//这个是记录模N余i之后的数值 7 8 memset(A, -1, sizeof(int) * N); 9 int factor = 1; 10 A[1] = 1; 11 1

找出十进制数中出现的&#39;&#39;一&#39;&#39;的个数

一.题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解决思路 通过列举几个数进行计算,可以发现函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4

整数中1 的个数

问题 求整数中1的个数 原理 一个数n若不为0,从数的最低为到最高位,第一个为1 的位记为 i ,则减去 1 之后,改为变为0,i 右边的所有位都变为1,因此 n & (n-1)可得 n中剩余比 i 更高位序 的 部分 ,循环此操作,则可得 1 的计数. 代码 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int n,s,counter = 0; 7 cout << " Plea

找出所有最长连续重复子串及其个数

问题描述: 找出字符串中所以最长连续重复子串及其个数 比如:输入:123234,最大连续重复字符串为23,个数为2 输入:5555,最大连续重复字符串为555,个数为2 输入:aaabbb 最大连续重复字符串为aa,个数为2:和bb,个数为2 必须存在重复的字符串才算,只出现一次的不算.可能存在多个相同长度的不同字符串,比如aaabbb. 分析:最直接的想法是利用两个指针循环遍历比较所有可能的子串,记录下所有子串长度,然后找到所有最大连续子串及其个数,时间复杂度为O(n^2).在网上看到一种利用

算法试题 - 找出一个序列中出现频率最高的三个数

题目 找出一个序列中出现频率最高的三个数 解析 思路一 创建一个新字典, k 为 序列的值, 然后 v 的初始值 0, 然后循环序列进行计数, 然后进行新字典的处理..... 不行, 不好处理了. 此思路不行 思路二 利用 colletctions 的 Counter 模块, 内部有个方法可以解决 k 值问题 答案 答案一 可以往下继续实现, 但是有点麻烦了 li = [2, 5, 3, 4, 1, 8, 1, 2, 6, 6, 1, 5, 1, 5] d = dict.fromkeys(li,

找出一堆数中最小的前K个数

描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然有点浪费.比方让求10000个整数数组中的最小的10个数.用排序的话平均时间复杂度差为Nlog(N). 于是想到了,用堆来实现,可是自己实现又太麻烦.想到了java里面的TreeSet,先将K个数放入TreeSet中.因为TreeSet会对里面的元素进行排序.所以在TreeSet中的元素是有序的.以

课题练习——找从1到N出现的1的个数

#include<iostream.h>#include<conio.h>int Sum1(int n){ int count = 0; //记录1的个数 int factor = 1; //标记,逐位计算1的个数 int Lower = 0; int Curr = 0; int Higher = 0; while ( n/factor != 0) //每次计算Lower Curr Higher的值 { Lower = n - (n/factor) * factor; Curr =

剑指Offer30 从1到n整数出现1的个数

1 /************************************************************************* 2 > File Name: 30_NumerOf1.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月01日 星期四 20时46分06秒 6 ******************************************

485. 找出二进制串中连续的1的个数 Max Consecutive Ones

Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1,1,0,1,1,1] Output: 3 Explanation: The first two digits or the last three digits are consecutive 1s. The maximum number of consecutive 1s is 3. Note: T