编程之美中1的个数的问题

//采用最直接的方法,时间复杂度为O(N*logN);
/*#include <iostream>
#include<typeinfo>
#include<specstrings.h>
#include<string>
using namespace std;
int num_one(int n)
{
	int count=0;
	while(n)
	{
		count+=(n%10==1)?1:0;
		n/=10;
	}
	return count;
}
int  core(int num)
{
	int i=1;
	int count=0;
	for(;i<=num;++i)
	{
		count+=num_one(i);
	}
	return count;
}
  int main()
  {
	  cout<<core(10)<<endl;
	  system("pause");
	  return 0;
  }*/
//下面采取对每位进行分析的方法对来求的1的个数
#include<iostream>
using namespace std;
int num_one(int n)
{
	int count=0;
	int low=0;
	int cur=0;
	int high=0;
	int factor=1;
	while(n/factor!=0)
	{
		low=n-(n/factor)*factor;
		cur=(n/factor)%10;
		high=n/(factor*10);
		switch(cur)
		{
		case 0:
			count+=high*factor;
			break;
		case 1:
			count+=high*factor+low+1;
			break;
		default :
			count+=(high+1)*factor;
			break;
		}
		factor*=10;

	}
	return count;
}
int main()
{
	cout<<num_one(5)<<endl;
	system("pause");
	return 0;
}

时间: 2024-08-28 21:05:12

编程之美中1的个数的问题的相关文章

编程之美——最大的k个数

方法一:使用快速排序划分函数partion将数组分为两组:sa和sb            (1)若sa组的个数大于K,则继续在sa分组中找取最大的K个数字 .            (2)若sa组中的数字小于K ,其个数为num,则继续在sb中找取 K-num个最大数字 . 复杂度:N*log2(K); 类似快速排序的partition过程,当参考值随机选取时,复杂度为O(N) 具体参考:http://blog.csdn.net/v_JULY_v/article/details/6370650

编程之美中判断某个字符串是否是另一个字符串的移位结构的子串

#include<iostream> #include<string> using namespace std; bool is_circle(string src,string des) { if(src.empty()||des.empty()) return false; string temp=src; temp+=src; string::size_type pos=0; pos=temp.find(des); if(pos==string::npos) return f

编程之美之买票找零

题目:假设有2N个人在排队买票,其中有N个人手持50元的钞票,另外有N个人手持100元的钞票,假设开始售票时,售票处没有零钱,问这2N个人有多少种排队方式,不至使售票处出现找不开钱的局面? 分析:队伍的序号标为0,1,...,2n-1,并把50元看作左括号,100元看作右括号,合法序列即括号能完成配对的序列.对于一个合法的序列,第0个一定是左括号,它必然与某个右括号配对,记其位置为k.那么从1到k-1.k+1到2n-1也分别是两个合法序列.那么,k必然是奇数(1到k-1一共有偶数个),设k=2i

编程之美之实时排名算法

首先来看一个实时排名算法 参考文献 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. 存储结构 首先,我们用一张用户积分表user_score来保存用户的积分信息. 表结构: 示例数据: 下面的算法会基于这个基本的表结构来进行. 算法1:简单SQL查询 首先,我们很容易想到用一条简单的SQL语句查询出积分大于该用户积分的用户数量: select 1 + count(t

编程之美之最短摘要生成

书上给出了最短摘要的描述即算法,简单来说就是: 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的range里包含所有关键字 .然后每次迭代,尝试调整pBegin和pEnd: 1.pBegin递增,直到range无法包含所有关键字 2.pEnd递增,直到range重新包含所有关键字 计算新的range,与旧的range相比,看是否缩短了,如果是,则更新 不考虑关键字的先后顺序 .这里给出最短摘要算法的几个应用,首先是leetcode上面的两题: M

java并发编程之美-阅读记录1

1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的一个执行路径,一个进程中至少会有一个线程,进程中的多个线程共享进程的资源. 线程:是cpu分配的基本单位. 由上图可看出,一个进程中会有多个线程,多个线程共享堆和方法区,但是每一个线程都会有自己的栈和程序计数器. 为什么要将栈和程序计数器设置为线程私有的呢? 前边说线程是cpu执行的基本单位,而cp

编程之美---最大公约数

该文出自于编程之美中关于最大公约数问题一章. 任意给定两个数字,得到其最大公约数 GCD(greatest common divisor),如果两个数字都很大怎么解决. 分析:最大公约数早在公元前300年,欧几里得的<几何原本>里就提出了一个高效率算法---辗转相除法. 解法一: 假设f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,则x=ky+b,如果一个数字能同时整除x,y,那么必能够同时整除b,y:而能够同时整除b,y的数必能够同时整除x,y,即x,y的公约数与b,y的公约数

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou

编程之美——二进制数中1的个数

解法一:若二进制末尾为1,则除以2余1: int count(int a) { int num=0; while(a) { if(a%2==1) ++num; a=a/2; } return num; } 解法二:使用移位操作相除: int count(int a) { int num=0; while(a) { num+=a&0x01; a>>=1; } return num; } 解法三:以上两种算法复杂度log2(t),t为a的二进制表示位数,若要求复杂度仅与二进制表示中1的个数