下面用两种方法求两个数的最大公约数
第一种,用递减循环从较小的数开始到0依次查找能同时整除两个数的数,则这个数就为这两个数的最大公约数,代码如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 0;
int b = 0;
int tmp = 0;
int i = 0;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
if (a < b) //将两个数中较小的数赋给变量tmp
{
tmp = a;
}
else
{
tmp = b;
}
for (i = tmp; i > 0; i--)
{
if (a%i == 0 && b%i == 0)
{
printf("最大公约数为:%d\n", i);
break;
}
}
system("pause");
return 0;
}
{
int a = 0;
int b = 0;
int tmp = 0;
int i = 0;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
if (a < b) //将两个数中较小的数赋给变量tmp
{
tmp = a;
}
else
{
tmp = b;
}
for (i = tmp; i > 0; i--)
{
if (a%i == 0 && b%i == 0)
{
printf("最大公约数为:%d\n", i);
break;
}
}
system("pause");
return 0;
}
第二种方法,辗转相除法,代码如下
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
int main()
{
int a = 24;
int b = 15;
int tmp = 0;
//辗转相除法
while (a%b) //当a%b为真即a%b不为0时,进入循环体,当a%b为假时即a%b为0时不进入循环体,此时b就是最大公约数
{
tmp = a%b; //将a%b的值赋给tmp
a = b; //将b的值赋给a
b = tmp; //将tmp的值赋给b,下次循环的条件就是a%b即b%tmp
}
{
int a = 24;
int b = 15;
int tmp = 0;
//辗转相除法
while (a%b) //当a%b为真即a%b不为0时,进入循环体,当a%b为假时即a%b为0时不进入循环体,此时b就是最大公约数
{
tmp = a%b; //将a%b的值赋给tmp
a = b; //将b的值赋给a
b = tmp; //将tmp的值赋给b,下次循环的条件就是a%b即b%tmp
}
printf("最大公约数:%d\n", b);
system("pause");
return 0;
}
system("pause");
return 0;
}
下面是对第二种方法辗转相除法的一点小小的优化
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
int main()
{
int a = 24;
int b = 15;
int tmp = 0;
//辗转相除法
while (tmp=a%b) // 将条件与赋值写为一个式子,可以减少一次计算。当a%b为真即a%b不为0时,进入循环体,当a%b为假时即a%b为0时不进入循环体,此时b就是最大公约数
{
a = b; //将b的值赋给a
b = tmp; //将tmp的值赋给b,下次循环的条件就是a%b即b%tmp
}
{
int a = 24;
int b = 15;
int tmp = 0;
//辗转相除法
while (tmp=a%b) // 将条件与赋值写为一个式子,可以减少一次计算。当a%b为真即a%b不为0时,进入循环体,当a%b为假时即a%b为0时不进入循环体,此时b就是最大公约数
{
a = b; //将b的值赋给a
b = tmp; //将tmp的值赋给b,下次循环的条件就是a%b即b%tmp
}
printf("最大公约数:%d\n", b);
system("pause");
return 0;
}
system("pause");
return 0;
}