除法(/)和取余(%)的使用
例 1: 求兩個數的最大公約數gcd(a,b)和最小公倍數lcm(a,b)
思路1):
gcd(a,b)函數 :判斷兩個數中較小的數(假設 min = b), 定義一個變量tmp保存較小的那個值 :tmp = b並依次減一( tmp -= 1)(不能直接用b進行自減因為后面要判斷b%tmp 是否等於零.若對b的值進行更改,則無法進行判斷.),並判斷tmp是否能被a,b整除,成立則返回tmp.
lcm(a,b)函數 : 同理找出a,b中較大的(假設為a),定義一個變量tmp保存a(原理同上),通過依次加上tmp = tmp+a,判斷(tmp%b == 0)是否從成立,成立則返回tmp, tmp 即為所求;
代碼:
int Gcd(int a, int b) { assert(a* b != 0); //若存在0 則退出程序且給出警告 int min = a < b ? a : b; int tmp = 0; for (int i = min; i > 0; i--)//(此處的i) { if (a % i == 0 && b % i == 0)//若滿足條件則說明此時i就是a,b的最大公約數.將i的值賦給tmp,並跳出循環. { tmp = i; break; } } return tmp;//返回最大公約數. } int Lcm(int a, int b) { assert(a * b != 0);//對傳遞進函數的值進行判斷. int max = a > b ? a : b; int tmp = max; while (tmp % a != 0 || tmp % b != 0) //當(tmp%a==0&&tmp%b==0)退出循環. { tmp = tmp + max; } return tmp; } int main() { int a = 0, b = 0; printf("input two number: ");//輸入兩個數 scanf_s("%d %d", &a, &b); int gcd = Gcd(a, b); int lcm = Lcm(a, b); printf("Gcd(%d,%d) = %d\nLcm(%d,%d) = %d", a, b, gcd, a, b, lcm); return 0; }
運行結果:
思路2):
gcd(a,b):根據歐幾里得定理(輾轉相除法)(gcd(a,b) == gcd(b,a%b)) (即a,b的最大公約數,等於b,a%b 的最大公約數);
lcm(a,b):利用最大公約數進行求解,假設tmp為gcd(a,b),則a/tmp ==m , b/tmp==n ,則gcd(m,n)==1,於是可以得到lcm(a,b) == m*n*tmp
代碼:
int Gcd(int a, int b) { if (a == 0 || b == 0)//判斷輸入的值是否符合要求. return -1; while (a % b != 0)// { int tmp = a % b; a = b; b = tmp; } return b; } int Lcm(int a, int b) { assert(a * b != 0); int tmp = 0; return tmp = a * b / Gcd(a, b); } int main() { int a = 0, b = 0; printf("input two number: ");//輸入兩個數 scanf_s("%d %d", &a, &b); int gcd = Gcd(a, b); int lcm = Lcm(a, b); printf("Gcd(%d,%d) = %d\nLcm(%d,%d) = %d", a, b, gcd, a, b, lcm); return 0; }
運行結果:
例2: 將一個十進制整數(12345),正向打印和逆向打印.
分析:
1)正向打印:
若知道該數字的位數m,我們可以用12345/pow(10,m-1) 就可以得到最高位的數字.因此第一步需要求該數的位數m,同時可以看出12345%pow(10,m-1) = 2345,再通過上述方法就可以依次得到2,3,4,5
這樣就可以進行正向打印.
現在關鍵在於求位數m,12345 每除以10一次(只保留整數部分),位數就會相應的減少一,因此可以通過循環求的該數的位數m.
求位數的代碼如下:
int Digit(int num) { assert(num > 0);//對傳遞進來的值進行判斷. int sum = 0;//記錄位數 while (num / 10 != 0) { sum++; num = num / 10; } return num;//返回位數值 }
正向打印代碼:
void Print_Forward(int num, int k)//傳入數值以及該數值的位數 { assert(num > 0 && k > 1); int tmp = 0;//記錄最高位的數值 int k = 0; for (int i = k; i > 0; i++) { tmp = num / (pow(10, k - 1));//pow在math.h庫函數中 printf("%3d", tmp); k = (pow(10, k - 1)); num = num % k;// 將最高位去掉 } }
2)逆向打印:
分析:
用12345對10取余(12345 % 10 = 5)即可得到個位數5 ,想要得到4,則需要1234對10進行取余運算.而想得到1234 可以利用12345對10做除法運算.因為(12345 / 10 = 1234).
代碼如下:
void Print_order(int num) { assert(num > 0); int tmp = 0;//記錄數值 while (num != 0) { tmp = num % 10; printf("%3d", tmp); num = num / 10; } printf("\n");//換行 }
主函數:
int main() { int num = 12345; int k = Digit(num);
printf("位數:%d\n",k); Print_Forward(num, k); Print_order(num); return 0; }
運行結果: