朴素的剪枝思想
1.真分数分子<分母,排序之后部分遍历即可
2.直接计算是否有不等于1的公因数即可,但超时了
那就倍数直接跳过,不是倍数才判断公因数
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b){//计算最大公因数
if(a==0) return b;
if(b==0) return a;
if(a>b){
a%=b;
} else if(a<b){
b%=a;
}
return gcd(a,b);
}
bool isSimplifable(int a,int b){
return a%b==0 || b%a==0;
}
int main(){//习题6.5 北京大学 最简真分数
int n;
int elms[600];
while(cin>>n){
if(n==0) break;
for(int i=0;i<n;i++){
cin>>elms[i];
}
sort(elms,elms+n);
int counter=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){//真分数一定是分母大于分子,故从i+1开始
if(isSimplifable(elms[i],elms[j])) continue;//倍数,直接化简为整数
if(gcd(elms[i],elms[j])!=1) continue;//有公因数,当前不是最简形式
//cout<<elms[i]<<" "<<elms[j]<<endl;
counter++;
}
}
cout<<counter<<endl;
}
return 0;
}

京公网安备 11010502036488号