素数探求c语言程序设计,C语言 最大公约数与素数探求

本页求最大公约数用到的方法有三:

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;

}

240c612a65a98bd2c0434d95e05126b1.png

素数探求

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);/*是否分解完全*/

}

运行结果如下

185c6903a05d22bf4029af4a613bb333.png

标签:return,Gcd,min,int,max,素数,C语言,最大公约数,printf

来源: https://blog.csdn.net/foolish_smile/article/details/95377273

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值