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