NC230377. 新生训练
描述
输入描述
第一行两个正整数;
第二行两个正整数。
输出描述
第一行一个整数,表示所求的分数的个数;
第二行到第行,每行输出"x/y=a/b"(不含引号),其中"x/y"是约分前,"a/b"是约分的结果。
为了使答案便于判断,输出结果以x/y为第一关键字,x为第二关键字排序后输出,即x/y小的排前面,x/y相等时x小的排前面。
示例1
输入:
163 163 326 326
输出:
1 163/326=1/2
示例2
输入:
14 17 63 65
输出:
6 14/65=14/65 15/64=15/64 16/64=1/4 17/65=17/65 17/64=17/64 17/63=17/63
C++ 解法, 执行用时: 226ms, 内存消耗: 8604K, 提交时间: 2021-11-29 00:20:56
#include<bits/stdc++.h> using namespace std; int l1,l2,r1,r2,a[1010],b[1010],n=0,m=0; struct node { int a,b,c,d; }o[1010000]; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } inline bool cmp(node a,node b) { double x=(double)a.a/a.b; double y=(double)b.a/b.b; if(fabs(x-y)<1e-10) return a.a<b.a; else return x<y; } int main() { scanf("%d%d%d%d",&l1,&r1,&l2,&r2); for(int i=l1;i<=r1;i++) { for(int j=l2;j<=r2;j++) { int x=i,y=j,k1=0,k2=0; while(x>0) { a[++k1]=x%10; x/=10; } while(y>0) { b[++k2]=y%10; y/=10; } for(int p=1;p<=k1;p++) { for(int q=1;q<=k2;q++) { if(a[p]==b[q]) { a[p]=-1; b[q]=-1; } } } int h=0,l=0; for(int p=k1;p>0;p--) { if(a[p]!=-1) h=h*10+a[p]; } for(int q=k2;q>0;q--) { if(b[q]!=-1) l=l*10+b[q]; } if(l==0||h==0) continue; x=i,y=j; x/=gcd(i,j),y/=gcd(i,j); if(h==x&&l==y){ o[m++]={i,j,x,y}; } }} sort(o,o+m,cmp); printf("%d\n",m); for(int i=0;i<m;i++) { printf("%d/%d=%d/%d\n",o[i].a,o[i].b,o[i].c,o[i].d); } }