LK的数学题
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- LK最近遇到一个问题,需要你帮她一下。一个整数n,求[1,n)中,和n互素的数的个数。
- 输入
- 多组测试数据,每一行有一个整数n(n<1000000001),0表示输入结束。
- 输出
- 小于n同时和n互素的整数的个数
- 样例输入
-
7 12 0
- 样例输出
-
6 4
开始用了原始方法,果断超时:#include<stdio.h> int prim(int a,int b) { return (b==0)?(a==1):prim(b,a%b); } int main() { int n; while(scanf("%d",&n),n) { int sum=0; for(int i=2;i<=n;++i) if(prim(n,i)) sum++; printf("%d ",sum+1); } return 0; }
后来听说要用 欧拉定理,又是欧拉定理,看了半天果断还是不太懂。代码和 理论差的不小,算啦,记住代码算啦
代码:
#include<stdio.h> int eular(int n) { int ret=1,i; for(i=2;i*i<=n;i++) if(n%i==0) { n/=i; ret*=i-1; while(n%i==0) { n/=i; ret*=i; } } if(n>1) ret*=n-1; return ret; } int main() { int n; while(scanf("%d",&n),n) { printf("%d ",eular(n)); } return 0; }