辗转相除:
算法分析:有两个数a和b,
设a>b,
首先求a和b的余数,b赋值给a,余数赋值给b;
重复以上操作,直到余数为0;
b值即为两数的最大公约数
#include<stdio.h>
/*辗转相除法求最大公约数*/
int gcd(int m,int n)
{
int r;
r=m%n; //求余数
while(r!=0) //辗转相除
{
m=n;
n=r;
r=m%n;
}
return n; //返回最大公约数
}
/*主函数*/
void main()
{
int a,b,c;
int i;
printf("输入两个正整数(空格隔开):\n");
scanf("%d,%d\n",&a,&b);
c=gcd(a,b);
printf("a和b的最大公约数是:%d\n",c);
}
相减法:
算法分析:有两个整数a和b;
若a>b,则a=a-b;
若a<b,则b=b-a;
重复以上操作,直到a=b,
a(或b)为两数最大公约数
/*相减法求最大公约数*/
#include<stdio.h>
/*主函数*/
int main()
{
int m,n;
int t;
printf("输入m和n:");
scanf("%d,%d\n",&m,&n);
while(m>0&&n>0)
{
if(m>n)
m=m-n;
else
n=n-m;
}
printf("最大公约数为:%d\n",m);
return 0;
}
穷举法:
算法分析:有两个整数a和b;
设i=1;
若a,b能同时被i整除,则t=i;
i++;
若i<=a(或b),重复以上操作,直到i>a(或b);
则t为最大公约数;
#include<stdio.h>
void main()
{
int a,b,c;
int i;
printf("输入两个正整数(空格隔开):\n");
scanf("%d %d",&a,&b);
if(b>a)
{
c=a;
a=b;
b=c;
}
for(i=b;i>=1;i--)
{
if(a%i==0&&b%i==0)
break;
}
printf("a和b的最大公约数是:%d\n",i);
}