编程之美第二章

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次。



猜你喜欢

转载自blog.csdn.net/feng_xinlei/article/details/80986897