题目链接:http://noi.openjudge.cn/ch0205/7834/
题意:使用两个数组,一个存储数字一个存储组号
每次将数与当前已知所有组进行判断是否可以合并,如果不可以则另起一个新组
#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;
int a[10005],b[10005];//一个存数一个存组号
int size;
bool hz(int a1,int b1){//判断是否互质
for(int i=2;i<=max(a1,b1);i++){
if(a1%i==0&&b1%i==0){
return false;
}
}
return true;
}
int main(){
int n;
cin>>n;
size=1;
for(int i=0;i<n;i++){
int tmp;
cin>>tmp;
a[i]=tmp;
b[i]=0;
}
b[0]=size;
size++;
for(int i=1;i<n;i++){//对于每个数判断是否与已知分组中互质,如果与一个已知组中任何一个元素互质则归为同一组
bool f=false;
for(int j=1;j<size;j++){//对每个组遍历一边
bool flag=true;
for(int p=0;p<n;p++){//对每个元素如果属于该组则判断是否互质
if(i!=p&&b[p]==j){
if(!hz(a[p],a[i]))flag=false;
}
}
if(flag){//与当前一个组互质
f=true;
b[i]=j;
break;
}
}
if(!f){//没有任何组与之互质
b[i]=size;
size++;
}
}
cout<<size-1<<endl;
}