1.最大公约数
(1)辗转相除法
计算两个正整数num1 num2的最大公约数,采用函数嵌套调用的形式来求所求那个自然数的最大公约数。
算法思想:
设两个数为num1,num2 ,设其中num1做被除数,num2 做除数,tmp做余数;
然后将较大的数字存放入num1中,较小的数存放入num2中;
求num1 / num2的余数;
若tmp == 0,则num2为最大公约数;
如果tmp != 0,则把num2的值赋给num1,tmp的值赋给num1;
返回第二步。
代码实现
int divisor(int a, int b)
{
int temp = 0;
if (a<b) //通过比较求出两个数中的最大值和最小值
{
temp = a;
a = b;
b = temp;
} //设置中间变量进行两数交换
while (b != 0) //通过循环求两数的余数,直到余数为0
{
temp = a%b;
a = b; //变量数值交换
b = temp;
}
return(a); //返回最大公约数到调用函数处
}
int main()
{
int num1 = 0;
int num2 = 0;
printf("请输入两个数:");
scanf("%d%d",&num1,&num2);
int ret = divisor(num1, num2);
printf("输入的两个数的最大公约数为:%d\n", ret);
return 0;
}
(2)穷举法
从两个数中较小的数开始由大到小列举,直到找到公约数李隆基中断列举,得到的公约数便是最大公约数。
int divisor(int a, int b) //自定义函数求两数的最大公约数
{
int temp = 0;
temp = (a>b) ? b : a; //采用条件表达式求出两个数中的最小值
while (temp>0)
{
if (a%temp == 0 && b%temp == 0) //只要找到一个数能同时被a,b所整除,则中止循环
break;
temp--; //如不满足if条件则变量自减,直到能被a,b所整除
}
return (temp); //返回满足条件的数到主调函数处
}
int main()
{
int num1 = 0;
int num2 = 0;
printf("请输入两个数:");
scanf("%d%d",&num1,&num2);
int ret = divisor(num1, num2);
printf("输入的数 %d 和 %d 的最大公约数为%d\n",num1 ,num2,ret);
}
2.求两个自然数的最小公倍数
(1)此种方法简单易想,但时间复杂度较高。
int main(){
int num1 = 0;
int num2 = 0;
printf("请输入两个数:");
scanf("%d%d",&num1,&num2);
int i = num1;
while (i)
{
if (i % num1 == 0 && i % num2 == 0){
break;
}
i++;
}
printf("%d\n",i);
return 0;
}
(2)改进和优化,降低时间复杂度
int main(){
int num1 = 0;
int num2 = 0;
printf("请输入两个数:");
scanf("%d%d",&num1,&num2);
int i = 1;
int tmp = num1;
while (i){
if (tmp * i %num1 == 0 && tmp * i % num2 == 0){
break;
}
i++;
}
printf("%d\n", tmp * i);
return 0;
}