1、数论资料(1) 欧拉函数最大公约数int gcd(int a,int b) return b?gcd(b,a%b):a;最小公倍数inline int lcm(int a,int b) return a/gcd(a,b)*b;/求1.n-1中与n互质的数的个数int eular(int n) int ret=1,i; for (i=2;i*i1) ret*=n-1; return ret;1.精度计算大数阶乘语法:int result=factorial(int n);参数:n:n 的阶乘返回值:阶乘结果的位数注意:本程序直接输出n!的结果,需要返回结果请保留long a需要 math.h源程
2、序:int factorial(int n)long a10000;int i,j,l,c,m=0,w; a0=1; for(i=1;i=n;i+) c=0; for(j=0;j0) m+;am=c; w=m*4+log10(am)+1;printf(n%ld,am); for(i=m-1;i=0;i-) printf(%4.4ld,ai);return w; 2.精度计算乘法(大数乘小数)语法:mult(char c,char t,int m);参数:c:被乘数,用字符串表示,位数不限t:结果,用字符串表示m:乘数,限定10以内返回值:null注意:需要 string.h源程序:void m
3、ult(char c,char t,int m)int i,l,k,flag,add=0;char s100;l=strlen(c);for (i=0;il;i+)sl-i-1=ci-0; for (i=0;i=10) si=k%10;add=k/10;flag=1; else si=k;flag=0;add=0;if (flag) l=i+1;si=add; else l=i;for (i=0;il;i+)tl-1-i=si+0;tl=0;3.精度计算乘法(大数乘大数)语法:mult(char a,char b,char s);参数:a:被乘数,用字符串表示,位数不限b:乘数,用字符串表示,
4、位数不限t:结果,用字符串表示返回值:null注意:空间复杂度为 o(n2)需要 string.h源程序:void mult(char a,char b,char s)int i,j,k=0,alen,blen,sum=0,res6565=0,flag=0;char result65;alen=strlen(a);blen=strlen(b); for (i=0;ialen;i+)for (j=0;j=0;i-)for (j=blen-1;j=0;j-) sum=sum+resi+blen-j-1j;resultk=sum%10;k=k+1;sum=sum/10;for (i=blen-2;i
5、=0;i-)for (j=0;j=i;j+) sum=sum+resi-jj;resultk=sum%10;k=k+1;sum=sum/10;if (sum!=0) resultk=sum;k=k+1;for (i=0;i=0;i-) si=resultk-1-i;sk=0;while(1)if (strlen(s)!=strlen(a)&s0=0) strcpy(s,s+1);elsebreak;4.精度计算加法语法:add(char a,char b,char s);参数:a:被乘数,用字符串表示,位数不限b:乘数,用字符串表示,位数不限t:结果,用字符串表示返回值:null注意:空间复杂
6、度为 o(n2)需要 string.h源程序:void add(char a,char b,char back)int i,j,k,up,x,y,z,l;char *c;if (strlen(a)strlen(b) l=strlen(a)+2; else l=strlen(b)+2;c=(char *) malloc(l*sizeof(char);i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i=0|j=0)if(i0) x=0;else x=ai;if(j9) up=1;z%=10;else up=0;ck+=z+0;i-;j-;if(up) ck+=
7、1;i=0;ck=0;for(k-=1;k=0;k-)backi+=ck;backi=0; 5.精度计算减法语法:sub(char s1,char s2,char t);参数:s1:被减数,用字符串表示,位数不限s2:减数,用字符串表示,位数不限t:结果,用字符串表示返回值:null注意:默认s1=s2,程序未处理负数情况需要 string.h源程序:void sub(char s1,char s2,char t)int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);tl1=0;l1-;for (i=l2-1;i=0;i-,l1-)if (s1l1-s2i=0)
8、tl1=s1l1-s2i+0;elsetl1=10+s1l1-s2i+0;s1l1-1=s1l1-1-1;k=l1;while(s1k=0) tl1=s1l1;l1-;loop:if (t0=0) l1=strlen(s1);for (i=0;il1-1;i+) ti=ti+1;tl1-1=0;goto loop;if (strlen(t)=0) t0=0;t1=0; 6.任意进制转换语法:conversion(char s1,char s2,long d1,long d2);参数:s:原进制数字,用字符串表示s2:转换结果,用字符串表示d1:原进制数d2:需要转换到的进制数返回值:null注
9、意:高于9的位数用大写AZ表示,216位进制通过验证源程序:void conversion(char s,char s2,long d1,long d2)long i,j,t,num;char c;num=0;for (i=0;si!=0;i+)if (si=0) t=si-0; else t=si-A+10;num=num*d1+t;i=0;while(1)t=num%d2;if (t=9) s2i=t+0; else s2i=t+A-10;num/=d2;if (num=0) break;i+;for (j=0;ji/2;j+)c=s2j;s2j=si-j;s2i-j=c;s2i+1=0;
10、8.组合序列语法:m_of_n(int m, int n1, int m1, int* a, int head)参数:m:组合数C的上参数n1:组合数C的下参数m1:组合数C的上参数,递归之用*a:1n的整数序列数组head:头指针返回值:null注意:*a需要自行产生初始调用时,m=m1、head=0调用例子:求C(m,n)序列:m_of_n(m,n,m,a,0);源程序:void m_of_n(int m, int n1, int m1, int* a, int head) int i,t; if(m1n1) return; if(m1=n1) for(i=0;im;i+) coutai
11、; / 输出序列 coutn; return; m_of_n(m,n1-1,m1,a,head); / 递归调用 t=ahead;ahead=an1-1+head;an1-1+head=t;m_of_n(m,n1-1,m1-1,a,head+1); / 再次递归调用 t=ahead;ahead=an1-1+head;an1-1+head=t; 素数表/用素数表判定素数,先调用initprimeint plist10000,pcount=0;int prime(int n) int i; if (n!=2&!(n%2)|(n!=3&!(n%3)|(n!=5&!(n%5)|(n!=7&!(n%7)
12、 return 0; for (i=0;plisti*plisti1;void initprime() int i; for (plistpcount+=2,i=3;i50000;i+) if (prime(i) plistpcount+=i;素数随机判定(miller_rabin)/miller rabin/判断自然数n是否为素数/time越高失败概率越低,一般取10到50#include #ifdef WIN32typedef _int64 i64;#elsetypedef long long i64;#endifint modular_exponent(int a,int b,int n
13、) /ab mod n int ret; for (;b;b=1,a=(int)(i64)a)*a%n) if (b&1) ret=(int)(i64)ret)*a%n; return ret;/ Carmicheal number: 561,41041,825265,321197185int miller_rabin(int n,int time=10) if (n=1|(n!=2&!(n%2)|(n!=3&!(n%3)|(n!=5&!(n%5)|(n!=7&!(n%7) return 0; while (time-) if (modular_exponent(rand()&0x7fff16
14、)+rand()&0x7fff+rand()&0x7fff)%(n-1)+1,n-1,n)!=1) return 0; return 1;矩阵乘法1. voidMultiply(inta100100,intb100100,intc100100) 2. 3. inti,j,k; 4. 5. for(i=0;irow_a;i+) 6. 7. for(j=0;jcolumn_b;j+) 8. 9. cij=0; 10. for(k=0;kcolumn_a;k+) 11. 12. cij+=aik*bkj; 13. 14. 15. 16. N皇后问题1. #include 2. #include 3.
15、 #include 4. usingnamespacestd; 5. 6. intmain() 7. 8. intn,temp=0; 9. cinn; 10. intf20; 11. if(n%6!=2&n%6!=3) 12. 13. if(n%2=0) 14. 15. for(inti=2;i=n;i+=2) 16. ftemp+=i; 17. for(inti=1;i=n-1;i+=2) 18. ftemp+=i; 19. 20. else21. 22. for(inti=2;i=n-1;i+=2) 23. ftemp+=i; 24. for(inti=1;i=n;i+=2) 25. ft
16、emp+=i; 26. 27. 28. else29. 30. intk=0; 31. if(n%2=0) 32. 33. k=n/2; 34. if(k%2=0) 35. 36. for(inti=k;i=n;i+=2) 37. ftemp+=i; 38. for(inti=2;i=k-2;i+=2) 39. ftemp+=i; 40. for(inti=k+3;i=n-1;i+=2) 41. ftemp+=i; 42. for(inti=1;i=k+1;i+=2) 43. ftemp+=i; 44. 45. else46. 47. for(inti=k;i=n-1;i+=2) 48. ft
17、emp+=i; 49. for(inti=1;i=k-2;i+=2) 50. ftemp+=i; 51. for(inti=k+3;i=n;i+=2) 52. ftemp+=i; 53. for(inti=2;i=k+1;i+=2) 54. ftemp+=i; 55. 56. 57. else58. 59. k=(n-1)/2; 60. if(k%2=0) 61. 62. for(inti=k;i=n-1;i+=2) 63. ftemp+=i; 64. for(inti=2;i=k-2;i+=2) 65. ftemp+=i; 66. for(inti=k+3;i=n-2;i+=2) 67. f
18、temp+=i; 68. for(inti=1;i=k+1;i+=2) 69. ftemp+=i; 70. ftemp+=n; 71. 72. else73. 74. for(inti=k;i=n-2;i+=2) 75. ftemp+=i; 76. for(inti=1;i=k-2;i+=2) 77. ftemp+=i; 78. for(inti=k+3;i=n-1;i+=2) 79. ftemp+=i; 80. for(inti=2;i=k+1;i+=2) 81. ftemp+=i; 82. ftemp+=n; 83. 84. 85. 86. 87. for(inti=0;in;i+) 88. couti+1fiendl; 89. return0; 90. 91. 大数幂模1. #include 2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1