今天遇到一道奇怪的程序題,和日常的不一樣。一樣都是互質,可是通常的題目都是判斷兩個數字是否互質,但這道題則是給定一個數字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 }