本页求最大公约数用到的方法有三:
1、 穷举法:先找到a,b中较小者赋值给t,从t-1开始求余,判断是否为公约数,往下穷举。
int Gcd_1(int a, int b)
{
int i, min;
min = a < b ? a : b; /*取最小值*/
while((a % min != 0 || b % min != 0) && (min > 0))/*对a,b同时取余,都等于0 时为最小公约数*/
{
min--;
}
return min;
}
2、欧几里得算法:设r = a mod b表示a对b求余的余数,若r!=0,将b作为新的a,r作为新的b,即Gcd(a, b) = Gcd(b, r),重复a mod b 运算直到 r = 0为止,如:Gcd(50,15) = Gcd(15,5) = Gcd(5,0)=5。
int Gcd_2(int a, int b)
{
int max, min;
max = a > b ? a : b; /*取最大值*/
min = a > b ? b : a; /*取最小值*/
if(min == 0)
return max;/*若求余为0,返回非0数据*/
else
return Gcd_2(min, max % min); /*递归调用*/
}
3、使用如下三条性质:
(1)若a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b);
(2)若b>a,则Gcd(a, b) = Gcd(a, b-a);
(3)若a=b,则Gcd(a, b) = a = b;
int Gcd_3(int a, int b)
{
if(a > b)
return Gcd_3(a - b, b); /*递归调用,性质1*/
if(a < b)
return Gcd_3(b - a, a); /*递归调用,性质2*/
else
return a; /*性质3*/
}
完整代码如下
/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/
#include
int Gcd_1(int a, int b);
int Gcd_2(int a, int b);
int Gcd_3(int a, int b);
int main()
{
int a, b, x1, x2, x3;
scanf("%d%d", &a, &b);
x1 = Gcd_1(a, b);
x2 = Gcd_2(a, b);
x3 = Gcd_3(a, b);
printf("%d\n", x1);
printf("%d\n", x2);
printf("%d\n", x3);
return 0;
}
int Gcd_1(int a, int b)
{
int i, min;
min = a < b ? a : b;
while((a % min != 0 || b % min != 0) && (min > 0))
{
min--;
}
return min;
}
int Gcd_2(int a, int b)
{
int max, min;
max = a > b ? a : b;
min = a > b ? b : a;
if(min == 0)
return max;
else
return Gcd_2(min, max % min);
}
int Gcd_3(int a, int b)
{
if(a > b)
return Gcd_3(a - b, b);
if(a < b)
return Gcd_3(b - a, a);
else
return a;
}
素数探求
IsPrime()函数采用的判别方式为:不能被2~(int)sqrt(m)之间的数整除的数m,一定不能被1和它本身之外的其他任何整数整除。
下程序功能:判断是否为素数,是则输出“It is a prime.”,否则进行质因数分解,如:90=233*5;
代码如下
/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/
#include
#include
int IsPrime(int n); /*素数判断*/
void Breakup(int n);/*质因数分解*/
int main()
{
int n = 1, a;
printf("Enter n:");
while(n < 2)
{
scanf("%d", &n);
if(n < 2)
printf("请输入大于1的数\n");
}
a = IsPrime(n); /*判断是否为素数,是则输出字符串*/
if(a == 0)
printf("It is a prime number\n");
else
{
printf("%d=",n);
Breakup(n);/*不是素数则进行质因数分解*/
}
return 0;
}
int IsPrime(int n) /*素数判断*/
{
int i = 2; /*从2开始*/
while(i <= sqrt(n))/*2~sqrt(n)*/
{
if(n % i == 0)
return 1; /*能被整除,返回1*/
i++;
}
return 0; /*不能整除返回0*/
}
void Breakup(int n)/*质因数分解*/
{
int i = 2, a;
do{
if(n % i == 0)/*找到最小因数*/
{
printf("%d", i); /*输出最小因数*/
n = n / i;/*求约数*/
a = IsPrime(n);/*判断约数是否为素数,能否继续分解*/
if(a == 0)
printf("*%d\n", n);/*不能分解则换行,结束*/
else
printf("*");/*能分解打印“*”*/
i = 1;/*将i 复位,从1开始*/
}
i++;
}while(a != 0);/*是否分解完全*/
}
运行结果如下
标签:return,Gcd,min,int,max,素数,C语言,最大公约数,printf
来源: https://blog.csdn.net/foolish_smile/article/details/95377273