除法(/)和取餘(%)的使用git
例 1: 求兩個數的最大公約數gcd(a,b)和最小公倍數lcm(a,b)函數
思路1):spa
gcd(a,b)函數 :判斷兩個數中較小的數(假設 min = b), 定義一個變量tmp保存較小的那個值 :tmp = b並依次減一( tmp -= 1)(不能直接用b進行自減由於後面要判斷b%tmp 是否等於零.若對b的值進行更改,則沒法進行判斷.),並判斷tmp是否能被a,b整除,成立則返回tmp.3d
lcm(a,b)函數 : 同理找出a,b中較大的(假設爲a),定義一個變量tmp保存a(原理同上),經過依次加上tmp = tmp+a,判斷(tmp%b == 0)是否從成立,成立則返回tmp, tmp 即爲所求;code
代碼:blog
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; }
運行結果:input
思路2):it
gcd(a,b):根據歐幾里得定理(展轉相除法)(gcd(a,b) == gcd(b,a%b)) (即a,b的最大公約數,等於b,a%b 的最大公約數);class
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; }
運行結果: