蒜头君给定 n 个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组? 输入格式 第一行是一个正整数 n。1≤n≤10。 第二行是 n 个不大于 10000 的正整数。 输出格式 一个正整数,即最少需要的组数。
6 14 20 33 117 143 175
3
一维数组代码如下:
#include<iostream> using namespace std; int a[15];//存储数字 int b[15]; //存储数字在第几组 int icount=0; int judge(int a,int b) { if(a==1||b==1)//如果a或b为1则两个数字一定互质 return 1; int t; while(1) { t=a%b; if(t==0) { break; } else { a=b; b=t; } } if(b>1) return 0; else return 1; } int main() { int m; cin>>m; for(int i=0;i<m;i++) cin>>a[i]; icount=1; b[0]=1; int flag;//用来判断是否能在这组 int q; for(int j=1;j<m;j++)//给第j个数字分组 { q=1;//从第一组开始判断 flag=1; while(1) { for(int i=0;i<j;i++)//寻找第j个数字之前的第q组的数字 { if(b[i]==q) { if(judge(a[i],a[j])==0) { flag=0; break; } } } if(flag==0)//如果与改组数字不互质 { if(q!=icount) { q++; flag=1;//注意这里,我们一开始都是默认能够进入这组的 } else//如果这是最后一组了 { icount++; b[j]=icount; break; } } else if(flag==1)//如果能够进入这组 { b[j]=q;//将该数字组数设置 break; } } } cout<<icount<<endl; return 0; }二维数组代码如下:
#include<bits/stdc++.h> using namespace std; int judge(int a,int b) { int r=a%b; while(r) { a=b; b=r; r=a%b; } if(b==1) return 1; else return 0; } int main() { int n,m; cin>>n; int a[10][11]={0}; cin>>m; a[1][1]=m; int count=1; for(int i=0;i<n-1;i++) { cin>>m; int untidy=0;//这个标记为有无安置 for(int j=1;j<=count;j++) { int u; int flag=0;//默认能存放在这个组 for(u=1;a[j][u]!=0;u++) { if(judge(a[j][u],m)==0) { flag=1;//标记位不能存放 break; } } if(flag==0) { a[j][u]=m; untidy=1;//标记为已安置 break; } } if(untidy==0) { count++; a[count][1]=m; } } cout<<count<<endl; return 0; }