C语言求最大素公约数
题目描述:
Haue的ACM比赛又开赛了,小z兴致勃勃的来参赛,小z本来想拿一个奖回去的,可一上来就被一个题目给弄晕了,“这是哈呀”,小z说道,“啥是素数,啥是最大公约数,啥又是最大素公约数??”平日里,小z的老师已经将这些问题强调多次,可是健忘的小z却还是没有记住,于是他趴下睡着了,梦中见到了你,你告诉了他解题方法,然后他睡醒了,准备开始写题,又忘记了,于是你再次出现,直接将结果告诉了他,你还记得你告诉他的结果是什么吗?
输入
一行,两个整数n和m(int范围内)
输出
一行,一个数字,表示n和m的最大素公约数。(最大素公约数,即公约数中是素数的最大的一个,如果两个数字不存在最大素公约数,输出-1)
样例输入
6 12
样例输出
3
题解
#include<stdio.h>
int maxnum(int a,int b) //函数使用递归求最大公约数
{
int t,num;
while(b!=0)
{
num=a%b;
a=b;
b=num;
}
return a;
}
int primenum(int u)
{
int i;
int t=0;
for(i=2;i<u;i++)//判断从2开始至最大公约数
{
if(u%i==0)//判断公约数是否还有约数
{
u=u/i;//若有约数,则最大公约数不是素数,则进行约数替换
t=1;//t作为观测值
break;
}
}
if(t==0)
return u;//若没有约数返回main()函数
else
primenum(u);//若有约数返回此函数继续执行
}
int main()
{
int x,y,e,q;
scanf("%d%d",&x,&y);
e=maxnum(x,y);
q=primenum(e);
if(q==1)
printf("-1");
else
printf("%d",q);
return 0;
}
本题核心思想还是结合求最大公约数和素数的判定。