1、计算二进制数中1的个数:
int num=0;
while(v)
{
v&=(v-1);
num++;
}
2、2.4. 1的数目
输入n,写出1到n的所有1的个数
#include<iostream>
using namespace std;
long long Sums(long long n)
{
long long icount=0;
long long ifactor=1;
long long ilowernum=0;
long long icurrnum=0;
long long ihighernum=0;
while(n/ifactor!=0)//从个位开始,像高位看
{
ilowernum=n-(n/ifactor)*ifactor;//低位数
icurrnum=(n/ifactor)%10;//当前位
ihighernum=n/(ifactor*10);//高位数
switch(icurrnum)
{
case 0://当前位是0
icount+=ihighernum*ifactor;
break;
case 1://当前位是1
icount+=ihighernum*ifactor+ilowernum+1;//高位和低位
break;
default://当前位是其他
icount+=(ihighernum+1)*ifactor;
break;
}
ifactor*=10;
}
return icount;
}
int main()
{
long long n;
cin>>n;
cout<<Sums(n)<<endl;
return 0;
}
2.5 寻找最大的K个数
思路:堆排序。一遍搜索,找出K个最大的数,遇到比最小的大的插入,把最小的挤出去。最小堆。
2.6 精确表达浮点数
2.7 最大公约数问题
1、f(x,y)=f(y,x%y)
eg: f(42,30)=f(30,12)=f(12,6)=f(6,0)=6
2、f(x,y)=f(x-y,y)
3、x、y都是偶数,f(x,y)=2*f(x/2,y/2)
x偶,y奇数,f(x,y)=f(x/2,y)
x奇数,y偶,f(x,y)=f(x,y/2)
x,y均为奇数,f(x,y)=f(y,x-y)
2.8 找出符合条件的整数,没看懂。。。
2.10 寻找数组中最大值和最小值
分治思想
(int max,int min)Search(int arr[],int b,int e)
{
if(e-b<=1)//不是最后一个数
{
if(arr[b]<arr[e])
return (arr[e],arr[b]);
else
return (arr[b],arr[e]);
}
int maxL,minL,maxR,minR,minV,maxV;
(maxL,minL)=Search(arr,b,b+(e-b)/2);
(maxR,minR)=Search(arr,b+(e-b)/2+1,e);
if(maxL>maxR)
maxV=maxL;
else
maxV=maxR;
if(minL<minR)
minV=minL;
else
minV=minR;
return (maxV,minV);
}
一共需要比较 1.5N-2次。