GitHub

最简真分数 1199

题目描述:

给出 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 }

 

posted @ 2019-06-20 19:07  繁华似锦觅安宁  阅读(565)  评论(0编辑  收藏  举报