今天遇到一道奇怪的程序題,和平常的不同。同樣都是互質,但是一般的題目都是判斷兩個數字是否互質,但這道題則是給定一個數字n,要求輸出所有小於等於n的與n互質的數,題目已經在下面給出:
質數與互質概念不是同一個,質數指的是一個數僅有1和它自己本身可以被整除;而互質則指的是兩個數只有1是共同的因數,有些人可能會將兩者混為一談。本篇文章是以互質為主題,接下來以互質作為主要內容,不過不得不說,這兩者的核心都是一樣的,采取歐幾里得算法(又叫輾轉相除法),通常用gcd表示,歐幾里得算法應用范圍非常廣泛,在今后的blog中我會專門寫一篇文章來講歐幾里得算法。
言歸正傳,這道題有多行測試數據,因此我們可以用while語句作為循環,考慮到會超時,於是我打算用自定義函數:
被除數a和除數b相除取余數c,將余數c給除數b,除數b給被除數a,以此往復,直到直到b為0,作為結束的標志。
本題考察的是自定義函數,其中歐幾里得算法非常重要。
以下是完整代碼:
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 }