今天遇到一道奇怪的程序题,和日常的不一样。一样都是互质,可是通常的题目都是判断两个数字是否互质,但这道题则是给定一个数字n,要求输出全部小于等于n的与n互质的数,题目已经在下面给出:算法
质数与互质概念不是同一个,质数指的是一个数仅有1和它本身自己能够被整除;而互质则指的是两个数只有1是共同的因数,有些人可能会将二者混为一谈。本篇文章是以互质为主题,接下来以互质做为主要内容,不过不得不说,这二者的核心都是同样的,采起欧几里得算法(又叫展转相除法),一般用gcd表示,欧几里得算法应用范围很是普遍,在从此的blog中我会专门写一篇文章来说欧几里得算法。函数
言归正传,这道题有多行测试数据,所以咱们能够用while语句做为循环,考虑到会超时,因而我打算用自定义函数:测试
被除数a和除数b相除取余数c,将余数c给除数b,除数b给被除数a,以此往复,直到直到b为0,做为结束的标志。spa
本题考察的是自定义函数,其中欧几里得算法很是重要。code
如下是完整代码:blog
1 #include <stdio.h> 2 int Gcd(int m,int n) 3 { 4 int o; 5 while(n>0) 6 { 7 o=m%n; 8 m=n; 9 n=o; 10 } 11 return m; 12 } 13 int main() 14 { 15 int a,i,b,s; 16 while(scanf("%d",&a)!=EOF) 17 { 18 if(a==1) 19 { 20 printf("1\n"); 21 } 22 else{ 23 s=0; 24 for(i=1;i<a;i++) 25 { 26 b=Gcd(i,a); 27 if(b==1) 28 { 29 s++; 30 } 31 } 32 printf("%d\n",s); 33 } 34 } 35 return 0; 36 }