给出 n 个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。
有多组测试数据,每组测试数据有两行。
第一行为一个整数 n (n <= 600)。
在第二行中有 n 个以空格分隔的不同的整数(大于等于 1 且小于等于 10, 000)。
当 n = 0 时,程序结束,不需要处理这组数据。
每行输出最简真分数组合的个数
7
3 5 7 9 11 13 15
3
2 4 5
0
17
2
思想:辗转相除法
#include<iostream>//初级 using namespace std; int main(){ int n; while(cin>>n){ if(n==0){ break; } int i,j,k,p,num=0; int m[n]; for(i=0;i<n;i++){ cin>>m[i]; } for(i=0;i<n-1;i++){ for(j=i+1;j<n;j++){ if(m[i]>m[j]){ p=m[i]; } else{ p=m[j]; } for(k=2;k<=p;k++){ if(m[i]%k==0&&m[j]%k==0){ break; } } if(k>m[j]){ num=num+1; } } } cout<<num<<endl; } return 0; }
升级版
1 #include<iostream> 2 using namespace std; 3 int num(int p,int q){//辗转相除法 4 if(q==0){ 5 return p; 6 } 7 else{ 8 return num(q,p%q); 9 } 10 } 11 int main(){ 12 int n; 13 while(cin>>n){ 14 if(n==0){ 15 break; 16 } 17 int i,j; 18 int m[n]; 19 for(i=0;i<n;i++){ 20 cin>>m[i]; 21 } 22 int sum=0; 23 for(i=0;i<n;i++){ 24 for(j=i+1;j<n;j++){ 25 if(num(m[i],m[j])==1){ 26 sum=sum+1; 27 } 28 } 29 } 30 cout<<sum<<endl; 31 } 32 return 0; 33 }
原文:https://www.cnblogs.com/zq-dmhy/p/11060693.html