您的位置:首页 > 其它

盖住关系的验证

2015-12-01 12:20 288 查看
//先将n所有因子求出保存在a数组中,如果a[i]是a[j]的整数倍,那么如果j<k<i并且a[k]是a[j]整数倍,
//a[i]是a[k]的整数倍,那么这组a[i],a[j]就可以忽略。所谓有补格就是任意一个因子都能找到另一个因子使得
//他们最大公约数是1,最小公倍数是n即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int ok;
void caculate(int a,int b,int n)
{
int r,m,k1,k2;
k1=a;
k2=b;
do
{
r=a%b;
a=b;
b=r;
}
while(r);
if ((a==1)&&(k1*k2/a==n))
ok=1;
}
int main()
{
int i,j,m,k,n,sum;//sum记录该数有几个因子
int a[1000];
printf("请输入整数n\n");
while(scanf("%d",&n)==1&&n)
{
memset(a,0,sizeof(a));
sum=0;
k=(int)sqrt(n);
for (i=1;i<=k;i++)
if (n%i==0)
{
a[sum++]=i;
a[sum++]=n/i;
}
if (k*k==n)
sum--;//如果根号正好为整数
sort(a,a+sum);
for (i=0;i<sum-1;i++)
for (j=i+1;j<sum;j++)
{
ok=0;
if (a[j]%a[i]==0)
{
ok=1;
for (k=i+1;k<j;k++)
if ((a[k]%a[i]==0)&&(a[j]%a[k]==0))
ok=0;
}
if (ok)
printf("<%d %d>\n",a[i],a[j]);
}
for (i=0;i<sum;i++)
{
ok=0;
for (j=0;j<sum;j++)
caculate(a[i],a[j],n);
if (!ok)
{
printf("不是有补格\n");
break;
}
}
if (ok)
printf("是有补格\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: