题目:2的29次方是一个9位数,在这个9位数中各个位上的数字都不一样,求0到9中哪一个数字没有出现过 ?
分析:由于,我们又知道一个数模9的余数等于这个数的所有位的数字之和模
9的余数,那么因为0到9的所有数字之和模9余0,而现在这个9位数模9余-4,说明缺少-4。
题目:证明素数有无穷多个
分析:利用反证法,假设素数有有穷多个,设最后一个素数为,那么我们设
,因为
模
所有小于它的素数都余1,那么说明也是一个素数,且比
大,这样与假设矛盾,所以素数有无穷多个。
题目:给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来。
分析:假设两个不同数值是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; }
原文:http://blog.csdn.net/achelloworld/article/details/23454177