朴素的剪枝思想
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; }