代码改变世界

随笔分类 -  算法---大数+数论

面试题:位操作实现四则运算

2013-09-01 23:05 by youxin, 7232 阅读, 收藏, 编辑
摘要: 首先看一个面试题:题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是... 阅读全文

求一个数任意位的值及位数

2013-09-01 21:11 by youxin, 3386 阅读, 收藏, 编辑
摘要: 如:a=12345求各位的值分别是多少;0(个位): a%10 =5 (只要mod10就是取一个数的个位,但是mod100不是取10位,而是取十位和个位,同理类推)10(十位):(a/10)=1234,再1234%10=4;100(百位)a/100=123;再mod10得出规律:只要把a除以pow(10,i);然后在mod10即可求出第i位的值。#include#includeusing namespace std;//求总位数int getNumOfDigits(int a){ int count=0; while(a) { a/=10; ... 阅读全文

大整数运算

2013-09-01 02:18 by youxin, 2839 阅读, 收藏, 编辑
摘要: C/C++中的int类型能表示的范围是-2E31-2E31–1。unsigned类型能表示的范围是0-2E32–1,即 0-4294967295。所以,int和unsigned类型变量,都不能保存超过10位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表示很大数值范围的double变量,但是由于double变量只有64位,所以还是不可能达到精确到小数点后面100位这样的精度。 double变量的精度也不足以表示一个100位的整数。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的.. 阅读全文

输出1到最大的N位数

2013-08-31 23:42 by youxin, 867 阅读, 收藏, 编辑
摘要: 题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。应聘者在解决这个问题的时候,最容易想到的方法是先求出最大的n位数是什么,然后用一个循环从1开始逐个输出。很快,我们就能写出如下代码:void Print1ToMaxOfNDigits1(int n){ int number=1; int i=0; while(i++using namespace std;// Increment a number. When overflow, return true... 阅读全文

卡特兰数(Catalan)简介

2013-08-31 18:04 by youxin, 3558 阅读, 收藏, 编辑
摘要: Catalan序列是一个整数序列,其通项公式是h(n)=C(2n,n)/(n+1) (n=0,1,2,...)其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452(从0开始)递推:令h(0)=1,h(1)=1 阅读全文

12个高矮不同的人,排成两排(catalan数)

2013-08-30 16:08 by youxin, 1303 阅读, 收藏, 编辑
摘要: 问题描述:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?这个笔试题,很YD,因为把某个递归关系隐藏得很深.问题分析:我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.比如000000111111就对应着第一排:0 1 2 3 4 5第二排:6 7 8 9 10 11010101010101就对应着第一排:0 2 4 6 8 10第二排:1 3 5 7 9 11( 012346 5 7891011 0 阅读全文

给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

2013-08-30 14:06 by youxin, 2154 阅读, 收藏, 编辑
摘要: 题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)。分析:分别从数组两端向中间推进。推出条件为左右相撞 当左端值为偶数,并且右端值为奇数时交换二值,用到一个临时空间。 当左端值为奇数,向右推进一个单位 当右端值为偶数,向左推进一个单位我最开始写的代码:void order(int* arr,int n){ int i=0,j=n-1; while(iusing namespace std;#define odd(s) (s%2)?1:0 //奇数#define even(s) (s%2... 阅读全文

一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。

2013-08-30 13:39 by youxin, 1123 阅读, 收藏, 编辑
摘要: 一个int数组, 比如 array[],里面数据无任何限制,要求求出所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。分析:这题很直观的一个算法是,挨个的查找各个元素是否满足条件,算法的复杂度是O(n^2),太过复杂。但如果我们在从左到右扫描数组的时候,能够维护一个candidate的数组, 该数组的元素满足: 到目前为止,这些元素都大于等于它前面的元素,而小于等于到目前为止扫描到的它右边的所有元素。 容易证明, candidate数组中的元素是按照非递减顺序排列的,即对任意的iusing namespace std;int f 阅读全文

素数检测

2013-08-27 15:56 by youxin, 176 阅读, 收藏, 编辑
摘要: http://blog.codinglabs.org/articles/prime-test.htmlhttp://blogread.cn/it/article/5754 阅读全文

c++ 实现将数字转换为中文数字输出

2013-08-26 15:34 by youxin, 4853 阅读, 收藏, 编辑
摘要: 实现如下函数:voidprintInChinese(intnum);这个函数输入一个小于100000000(一亿)的正整数,并在屏幕上打印这个数字的中文写法。例如:17->一十七120->一百二十201->二百零一1074->一千零七十四65536->六万五千五百三十六1010101->一百零一万零一百零一提示:请注意‘零’的处理。扩展:如果需要处理通用简化习惯,你将怎么处理,例如:17->十七120->一百二#include #include using namespace std;string unite[5]={"",& 阅读全文

海量数据处理方法

2013-08-26 01:29 by youxin, 238 阅读, 收藏, 编辑
摘要: http://blog.csdn.net/v_july_v/article/details/6685962http://hi.baidu.com/tjuer/item/bba1a52d2875d9f850fd87b0 阅读全文

转:海量数据找中位数

2013-08-26 01:25 by youxin, 2587 阅读, 收藏, 编辑
摘要: 题目如下:只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数,写一个算法。算法:1.利用外排序的方法,进行排序 ,然后再去找中位数2.另外还有个思路利用堆先求第1G大,然后利用该元素求第2G大,然后利用第2G大,求第3G大...当然这样的话虽不需排序,但是磁盘操作会比较多,具体还需要... 阅读全文

编程之美--寻找发帖水王(即:求数组主元素)

2013-08-23 15:50 by youxin, 1004 阅读, 收藏, 编辑
摘要: Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?分析与解法首先想到的是一个最直接的方法,我们可以对所有ID进行排序。然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N* log2N+N)。如果ID列表已经是有序的 阅读全文

编程之美 不要被阶乘吓倒

2013-08-22 23:41 by youxin, 742 阅读, 收藏, 编辑
摘要: 问题描述:1. 给定一个整数N,那么N的阶乘N!末尾有几个0?2. 求N!的二进制表示中最低位1的位置。分析与解法:我们不要去计算N!的值,如果我们从”哪些数相乘能得到10“这个角度来考虑,问题就变得简单多了。首先考虑,如果N!=K*(10^M) 且k不能被10整除,那么N!末尾后面有M个0.在考虑对N!进行质因数分解,N! =2xx 3yx 5z…由于10=2*5,所欲M只跟X和Z有关。每对2和5相乘都可以得到一个10,于是M=min(x,z).不能看出X大于等于Z,因为能被2整除的数的概率比能被5整除的数要高的多,所以把公式简化为M=Z;这意味着所以只要求求多少个5即可。求5的个数可以有两 阅读全文

转:优秀程序员不得不知道的20个位运算技巧

2013-08-04 15:04 by youxin, 334 阅读, 收藏, 编辑
摘要: 一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读《编程之美》求“1的数目”时,我才开始觉得位运算是如此之美,后来读到《Hacker's Delight》,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!但掌握简单的位运算技巧还是必要的,所以今天写这篇博文把我积累的一些位运算技巧分享给大家,这些技巧不会是如求“1的数目”的技巧,是最基本的一行位运算技巧 阅读全文

不使用临时变量交换两个整数

2013-08-03 22:33 by youxin, 1291 阅读, 收藏, 编辑
摘要: 最普通的方法用临时变量的方法就不说了,下面的没有用临时变量:int main(){ int a,b; while(scanf("%d%d",&a,&b)!=EOF) { a=a+b; b=a-b; a=a-b; printf("%d\t%d\n",a,b); } }有些人说当a,b比较大时会溢出产生错误的结果。其实不正确,溢出虽然会溢出,但是结果任然正确。为什么?我们假设a,b都是short int(int类似)。a 0x7fff 32767(2^15-1,有符号整形所能表示的最大范围)。b... 阅读全文

hdu 1282回文数猜想

2013-08-03 17:18 by youxin, 501 阅读, 收藏, 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1282Problem Description一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。至今为止还不知道这个猜想是 阅读全文

容斥原理及应用

2013-08-03 16:52 by youxin, 776 阅读, 收藏, 编辑
摘要: 在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。两个集合的容斥关系公式:A∪B = A+B - A∩B (∩:重合的部分)三个集合的容斥关系公式:A∪B∪C = A+B+C - A∩B - B∩C - C∩A +A∩B∩C在1到1000的自然数中,能被3或5整除的数共有多少个?不能被3或5整除的数共有多少个?分析:显然,这是一个重复计数问题(当然,如果不怕麻烦你可以分 阅读全文

求回文数算法

2013-08-03 16:10 by youxin, 7904 阅读, 收藏, 编辑
摘要: 问题: 求第N个回文数palindrome。 一个正数如果顺着和反过来都是一样的(如13431,反过来也是13431),就称为回文数。约束: 回文数不能以0开头。 回文数从1开始。首先我们要写一个算法求回文数。刚开始我想到用用字符串来存储数,然后判断原序和逆序是否相等。void func1(char a[]){ printf("%d",strlen(a)); char *p=a; char *q=a+strlen(a)-1; bool flag=true; while(q>p) { if(*q!=*... 阅读全文

判断无符号整数的二进制形式中是否包含偶数个1

2013-08-03 00:46 by youxin, 863 阅读, 收藏, 编辑
摘要: 题目要求:若二进制无符号整数x包含偶数个1,返回1,否则返回0.要求:只能使用位运算、加减法和==、!=,最多包含12个算术运算、位运算和逻辑运算,可以假设sizeof(unsigned)==4不能使用乘除模运算,不能使用条件分支,循环,函数调用,大小比较等(详见《深入理解计算机系统》第二章习题)首先,最朴素最直接的方法——一位一位统计肯定次数远远多于12次.考虑:异或运算(^)可以保持两个操作数1的个数的奇偶性.因为两个操作数,一1一0,结果为1,1的个数还是奇数;两0,结果为0,不影响,两1,结果为0,1的个数还是偶数.这样,想到了降量的思想,把判断32位数转化为16位,然后依次进行.先开 阅读全文
点击右上角即可分享
微信分享提示