盖住关系的验证
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; }
相关文章推荐
- mysql关系(二维表)的设计规范,范式
- Spring Data JPA调用存储过程实例
- Spring Data JPA调用存储过程实例
- 删除了Android Private Libraries之后怎么重新添加进去?
- 仿超级课程表demo
- 基于ajax的简单搜索实现方法
- LintCode: Longest Common Substring
- PS自动生成不同尺寸图标
- 关于android5.1 strings product值引起的复写字串不起效问题的解决方法
- POJ 1664 放苹果
- ZOJ - 2112 Dynamic Rankings(BIT套主席树)
- PhpStorm WebMatrix xDebug 配置开发环境
- 权限之路径拦截
- hough变换是如何检测出直线和圆的?
- FastReport经验
- Oracle修改表结构字段名和字段长度
- Oracle单组函数
- PHP接收json 并将接收数据插入数据库的实现代码
- linux下软链接和硬链接的区别 【转】
- 可扩展机器学习——概述