除法(/)和取余(%)的使用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; }
运行结果: