数论 约数定理 约数和定理 欧拉定理

来源:互联网 发布:java swing报表打印 编辑:程序博客网 时间:2024/05/01 14:17
//约数和定理/*数分解为(a^m)*(b^n),则这个数所有约数的和为:(a^0+a^1+a^2+a^3+…+a^m)(b^0+b^1+b^2+b^3+…+b^n).*/#include<stdio.h>#include<string.h>#include<math.h>int a[100];//存储素因子int b[100];//存储素因子次方int cont;void sbreak(int n)//将n分解为素因子的乘积{int i,flag;cont=0;memset(b,0,sizeof(b));for(i=2;i*i<=n;i++){flag=0;if(n%i==0){a[cont] = i;flag=1;}while(n%i==0){b[cont]++;n=n/i;}if(flag){cont++;}}if(n!=1){a[cont]=n;b[cont++]=1;}}int main(){int n,s,i,sum,j;while(~scanf("%d",&n)){sum=1;sbreak(n);for(i=0;i<cont;i++){s=0;for(j=0;j<=b[i];j++){s=s+(int )pow(a[i]*1.0,j*1.0);//约数和公式}sum=sum*s;}printf("%d\n",sum);}return 0;}
</pre><pre class="cpp" name="code">
//约数定理/*若正整数的素数分解式为 n=p1^a1*p2^a2...pk^ak,则n的约数的个数为d(n)=(a1+1)(a2+1)..(ak+1);*/
#include<stdio.h>#include<string.h>int a[100];//存储素因子int b[100];//存储素因子次方int cont;void sbreak(int n)//将n分解为素因子的乘积{int i,flag;cont=0;memset(b,0,sizeof(b));for(i=2;i*i<=n;i++){flag=0;if(n%i==0){a[cont] = i;flag=1;}while(n%i==0){b[cont]++;n=n/i;}if(flag){cont++;}}if(n!=1){a[cont]=n;b[cont++]=1;}}int main(){int n,s,i;while(~scanf("%d",&n)){s=1;sbreak(n);for(i=0;i<cont;i++){s=s*(b[i]+1);//约数定理}printf("%d\n",s);}return 0;}//欧拉定理//设正整数n=p1^a1*p2^a2...pk^ak,则不大于且与n互素的正整数个数为s(n)=n*(1-1/a1)..(1-1/ak)/*#include<stdio.h>int oula(int n)//求小于n与n互质的个数{int i;double sum,t;sum = n*1.0;for(i=2;i*i<=n;i++){if(n%i==0){t=1.0/i;sum=sum*(1-t);//欧拉定理}while(n%i==0){n=n/i;}}if(n!=1){t=1.0/n;sum=sum*(1-t);}return (int )sum;}int main(){int n,s;while(~scanf("%d",&n)){s=oula(n);printf("%d\n",s);}return 0;}*/

0 0