返回顶部

Hankson最大公约数最小公倍数的“逆问题”

#include<stdio.h>
int MaxYin(int a,int b)  //求最大公约数辗转相除法 
{
 int t;
 if(a<b)//大数放a中,小数放b中
 {
  t=a;
  a=b;
  b=t;
 }
 while(b!=0&&a%b!=0)//一直除到余数为0
 {
  t=a%b;
  a=b;
  b=t;
 }
 return b;//返回计算结果 
}
int main()
{
	int num,i,j,a0,a1,b0,b1;
	int result=0;   //结果 
	printf("请输入组数:\n");
	scanf("%d",&num);
	while(num--)
	{	
		printf("请输入a0,a1,b0,b1,且a0能被a1整除,b1能被b0整除。\n");
		scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
		for(i=1;i*i<b1;i++)  //在 1~sqrt(b1)的区间寻找满足条件的数 
		{
			if(b1%i==0)
			{
				if(i%a1==0&&(MaxYin(i/a1,a0/a1)==1)&&(MaxYin(b1/b0,b1/i)==1)) //满足条件的要求 
				result++;
				j=b1/i;
				if(i==j||j%a1!=0)
				continue;
				if((MaxYin(j/a1,a0/a1)==1)&&(MaxYin(b1/b0,b1/j)==1)) 
				result++;
			}
		}
		printf("满足条件的有%d个\n",result);
		result-=result; //清空result的值并继续下一组数据 
	}
	return 0;
}
posted @ 2020-04-02 12:42  violet-evergarden  阅读(171)  评论(0编辑  收藏  举报