盖住关系的验证

//先将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;
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值