题目: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;
}
数学与算法经典问题解析
本文探讨了四个有趣的数学和算法问题,包括2的29次方的位数特性、素数无限性的证明、寻找数组中出现一次的两个数字以及有序链表的合并。通过对这些问题的分析和解题思路的阐述,揭示了数学和算法的魅力。
1万+

被折叠的 条评论
为什么被折叠?



