摘要:
求二进制中1的个数。对于一个字节(8bit)无符号整形变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。我们首先看看无符号字节类型,c中char中默认是signed的,写一段代码:int main(){ char a='€'; printf("%d",a+0);}€的代... 阅读全文
随笔分类 - 算法---大数+数论
转:一个Sqrt函数引发的血案
2013-08-02 21:10 by youxin, 826 阅读, 收藏, 编辑
摘要:
我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢?虽然有可能你平时没有想过这个问题,不过正所谓是“临阵磨枪,不快也光”,你“眉头一皱,计上心来”,这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数;如果小了,就再拿右区间的中间数来试。比如求sqrt(16)的结果,你先试(0+16)/2=8,8*8=64,64比16大,然后就向左移,试(0+8)/2=4,4*4=16刚好,你得到了正确的结果sqrt( 阅读全文
进制转换算法
2013-08-02 18:04 by youxin, 1047 阅读, 收藏, 编辑
摘要:
pojg上面第2734,2735是关于8和10机制互转的。我刚开始用stack方法;#include#include#include#includeclass Stack{public: char a[16]; int i; Stack() { i=0; ... 阅读全文
相邻数字的基数不等比:skew数
2013-08-02 15:44 by youxin, 418 阅读, 收藏, 编辑
摘要:
2973:Skew数描述在 skew binary表示中, 第 k 位的值xk表示xk*(2k+1-1)。 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, 10120(skew) = 1*(25-1) + 0*(24-1) + 1*(23-1) + 2*(22-1) + 0*(21-1) = 31 + 0 + 7 + 6 + 0 = 44. 前十个skew数是 0、1、2、10、11、12、20、100、101、以及102。输入输入包含一行或多行,每行包含一个整数n。 如果 n = 0 表示输入结束,否则n是一个skew 数输出对于每一个输入,输出它的十进制表示。转换成十进 阅读全文
相邻数字的基数等比确定进制问题pojg2972
2013-08-02 15:10 by youxin, 875 阅读, 收藏, 编辑
摘要:
解决数制转换问题时,如果所给的数值不是用十进制表示的,一般用一个字符型数组来存放,数组的每个元素分别存储它的一位数字。然后按位转换求和,得到十进制表示,再把十进制转成成其他所求的进制表示。转成的结果也用一个字符型数组表示。根据数制表示中相邻位的基数关系,可以把不同的数制分成2类:一类数制表示中相邻位的基数是等比关系,如十进制表示。另一类相邻位的基数是不等比的。如时间表示中。2927:确定进制:描述6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10. 阅读全文
常用的算法:求闰年,判断素数,分解质因数,完数,水仙花数等
2013-08-02 11:46 by youxin, 1320 阅读, 收藏, 编辑
摘要:
1.如何计算闰年(Leap Year)? 四年一闰,百年不闰;四百年再闰。 具体参照:http://baike.baidu.com/view/3085625.htmJava代码booleanisLeapYear(intyear){return(year%4==0&&year%100!=0)||(year%400==0);}2.如何判断一个数是否是质数(Prime Number)? 质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。 具体参照:http://baike.baidu.com/view/1767.htmJava代码booleani 阅读全文
算术基本定理
2013-08-02 11:31 by youxin, 1832 阅读, 收藏, 编辑
摘要:
内容:任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积 N=(P_1^a1)*(P_2^a2)......(P_n^an) , 这里P_1<P_2<...<P_n是质数,其诸方幂ai 是正整数。这样的分解称为N 的标准分解式。算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。例如:,。算术基本定理的内容由两部分构成:分解的存在性:分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的。算术基本定理是初等数论中一个基本的定理,也是许多其他定理的逻辑支撑点和出发点。证明:算术 阅读全文
整除规则(原理,性质)
2013-07-27 15:48 by youxin, 54677 阅读, 收藏, 编辑
摘要:
各种被整除的数的特征(放在这里以备以后查阅方便) (1)被2整除的数的特征:一个整数的末位是偶数(0、2、4、6、8)的数能被2整除。 (2)被3整除的数的特征:一个整数的数字和能被3整除,则这个数能被3整除。 (3)被4整除的数的特征:一个整数的末尾两位数能被4整除则这个数能被4整除。可以这样快速判断:最后两位数,要是十位是单数,个位就是2或6,要是十位是双数,个位就是0、4、8。 (4)被5整除的数的特征:一个整数的末位是0或者5的数能被5整除。 (5)被6整除的数的特征:一个整数能被2和3整除,则这个数能被6整除。 (6)被7整除的数的特征:“割减法”。若一个整数的个位数字截... 阅读全文
快速幂取模
2012-06-08 13:06 by youxin, 287 阅读, 收藏, 编辑
摘要:
求a^b mod pb比较大,可以利用二分法。b=b(n)*2^n+b(n-1)*2^(n-1)++........b1*2^1+b0从高位到低位扫描。a^b mod p = ((a%p)^b) mod p求 3333^5555(%10)=3^5555(%10)3^4=813^4(%10)=1根据(a*b)%p=(a%p * b%p)%p 5555=4*1388+33^5555(%10)=(3^(4*1388)*(3^3))(%10)=(1*7)%10=7算法1简单算法:int modexp_simple(int a,int b,int n) { int ret = 1;... 阅读全文
筛法求素数
2012-05-06 21:25 by youxin, 736 阅读, 收藏, 编辑
摘要:
看通常做法:首先假设要检查的数是N好了,则事实上只要检查至N的开根号就可以了,道理很简单,假设A*B = N,如果A大于N的开根号,则事实上在小于A之前的检查就可以先检查到B这个数可以整除N。不过在程式中使用开根号会精确度的问题,所以可以使用i*i #includebool * prime(int n){ bool *p=new bool[n]; memset(p,n,sizeof(bool)*n);//可以不要p[0]=p[1]=false; for(int i=2;i#include#define mr 10bool notp[mr];//素数判定int pr[10... 阅读全文
欧拉函数
2012-05-06 00:54 by youxin, 1276 阅读, 收藏, 编辑
摘要:
在数论中,对正整数n,欧拉函数是小于n且与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。1、递推求解 欧拉函数可以很方便的计算小于某个数N但N互质的数的个数, 即M(1<=M<N)且gcd(M, N)=1, M的个数很容易由欧拉函数来计算出来. 欧拉函数的表达式为N*(1-1/f_1)*(1-1/f_2)*(1-1/f_3)....依次类推, 其中f_1, f_2, f_3等 阅读全文
fibonacci数的矩阵乘法
2012-04-15 02:01 by youxin, 367 阅读, 收藏, 编辑
摘要:
斐波那契数列1,1,2,3,5,8,13…….有如下定义F(n)=f(n-1)+f(n-2)F(1)=1F(2)=1对于以下矩阵乘法[F(n+1)]=[1 0][F(n) ][ F(n)]=[1 0][F(n-1)] 结果 F(n+1)=F(n)+F(n-1) F(n)=F(n) 设[ 1 1] [ 1 0]为Af(n)=Af(n-1)=A^n-1f(1)f(1)可以表示成[ 1 1] [ 1 0] 所以F[n] = A^n 还有另外一种形式:( F(n+1) F(n) F(n) F(n-1) ) = A^n;先看自己写的简单易懂的代码:#i... 阅读全文
hdc fibonacci number 1568
2012-04-14 20:47 by youxin, 393 阅读, 收藏, 编辑
摘要:
hdc1568Problem Description2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。Input输入若干数字n(0 <= n <= 100000000),每个数字一行。读到 阅读全文
基数等比,确定进制
2011-05-22 19:57 by youxin, 413 阅读, 收藏, 编辑
摘要:
问题描述6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13),而 42(13) = 4 * 131 + 2 * 130 = 54(10)。你的任务是写一段程序读入三个整数p、q和 r,然后确定一个进制 B(2 2 #include 3 4 long b2ten(char*x,int b){ 5 int ret=0,i; 6 int len=strlen(x); 7 for(i=0;i=b) return-1;10 ret*=b;11 ret+=x[i]-'0';12 ... 阅读全文