首页 > 其他 > 详细

经典题目(二)

时间:2014-04-13 07:28:07      阅读:541      评论:0      收藏:0      [点我收藏+]

题目:2的29次方是一个9位数,在这个9位数中各个位上的数字都不一样,求0到9中哪一个数字没有出现过 ?

 

分析:由于bubuko.com,布布扣,我们又知道一个数模9的余数等于这个数的所有位的数字之和模

     9的余数,那么因为0到9的所有数字之和模9余0,而现在这个9位数模9余-4,说明缺少-4。

 

 

题目:证明素数有无穷多个

 

分析:利用反证法,假设素数有有穷多个,设最后一个素数为bubuko.com,布布扣,那么我们设bubuko.com,布布扣,因为bubuko.com,布布扣

     所有小于它的素数都余1,那么说明bubuko.com,布布扣也是一个素数,且比bubuko.com,布布扣大,这样与假设矛盾,所以素数有无穷多个。

 

 

题目:给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来。

 

分析:假设两个不同数值是a,b,那么ans = a^b,然后求的ans中第一次出现1的位置cnt,根据异或运算特性,

     第一次出现1的地方就是这二个数位有区别的地方,比如10010101与11000001得到异或结果是01010100。

     那么第一次出现1的地方是第三位,a的第三位是1而b是0。接着遍历数值,找出第三位是1的数值就异或,得

     到的结果就是其中一个数与其他出现二次的数求异或,因为出现二次的数异或得到为0所有最后结果就是所

     求其中一个数。最后ans与该数求异或就得到另一个数。

 

void Work(int a[],int n)
{
    int ans = 0;
    for(int i=0;i<n;i++)
        ans ^= a[i];
    int t1 = ans;
    int t2 = ans;
    int cnt = 0;
    while(!(t1 & 1))
    {
        t1 >>= 1;
        cnt++;
    }
    for(int i=0;i<n;i++)
    {
        if((a[i] >> cnt) & 1)
            ans ^= a[i];
    }
    int x = ans;
    int y = ans ^ t2;
    if(x > y) swap(x,y);
    cout<<x<<" "<<y<<endl;
}


 

题目:将两个有序的链表合并为一个有序链表,不许再申请多余的空间。

 

代码:

void  Merge(List *list1, List *list2)  
{ 
    Node *p, *q, *r, *last;
    p = list1->next;  
    q = list2->next;
    last = list1;
    last->next = NULL;
    while(p && q) 
    {  
        if(p->data < q->data) 
        {
            r = p;
            p = p->next;
        }
        else 
        {
            r = q;
            q = q->next;
        }
        r->next = last->next;
        last->next = r;
        last = r;
    }
    if(p) last->next = p;    
    else  last->next = q;
    list2->next = NULL;
}


 

 

 

经典题目(二),布布扣,bubuko.com

经典题目(二)

原文:http://blog.csdn.net/achelloworld/article/details/23454177

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!