l 辗转相除法
算法描述:
辗转相除法是求两个正整数的最大公约数的一种算法.
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
例如求27和15的最大公约数过程为:
27÷15余1215÷12余312÷3余0因此,3即为最大公约数
数据流程图:
算法的数学证明:
证明辗转相除法的确可以求得最大公约数,只需证明gcd(a,b)=gcd(b,a%b).
证明:定义a=k*b+r ,即k=a/b , r=a%b
假设一个数d为a,b的一个公约数,表示为d|a且d|b,意为a能被d整除同时b也能被b整除.-->所以d|(k*b+r) --> 再加上因为d|b,也就是说d|k*b -->所以d|r ,即d|(a%b) -->所以d也是b和a%b的公约数-->最终得a,b的公约数也就是b,a%b的公约数,故而gcd(a,b)=gcd(b,a%b) .
两个数的最小公倍数等于他们的乘积除以最大公约数.
C#代码实现:
循环:
Console.WriteLine ("输入两个正整数(输入一个敲下回车): ");
int num1 = int.Parse (Console.ReadLine ());
int num2 = int.Parse (Console.ReadLine ());
int temp = num1*num2,r;
do{
r = num1 % num2;
num1 = num2;
num2 = r;
}while(r>0);
Console.WriteLine ("最大公约数是{0} ",num1);
Console.WriteLine ("最小公倍数是{0} ",temp/num1);
递归:
public static int gcd (int a, int b)
{
return (b==0?a:gcd(b,a%b));
}
l 辗转相减法
辗转相减法与辗转相减法相似
算法描述
有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行①
例如求27和15的最大公约数过程为:
27-15=12( 15>12 ) 15-12=3( 12>3 )
12-3=9( 9>3 ) 9-3=6( 6>3 )
6-3=3( 3==3 )
因此,3即为最大公约数
代码实现int temp = num1*num2;
while(num1!=num2)
{
if (num1 > num2)
num1 -= num2;
else
num2 -= num1;
}
Console.WriteLine ("最大公约数是{0} ",num1);
Console.WriteLine ("最小公倍数是{0} ",temp/num1);
int temp = num1*num2;
while(num1!=num2)
{
if (num1 > num2)
num1 -= num2;
else
num2 -= num1;
}
Console.WriteLine ("最大公约数是{0} ",num1);
Console.WriteLine ("最小公倍数是{0} ",temp/num1);