求助

P1482 Cantor表(升级版)

40分
by 孑然成愁 @ 2019-04-22 12:48:08


```cpp #include<iostream> using namespace std; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } //最大公约数 int main() { int a1,a2,b1,b2; char x; cin >> a1 >> x >> b1; cin >> a2 >> x >> b2;//x用来放中间的 / ,不用管它 int c1 = a1 * a2, c2 = b1 * b2; cout << c2 / gcd(c1, c2) << " " << c1 / gcd(c1, c2); //约分 return 0; } ```
by 三生万物 @ 2019-04-22 16:27:10


这道题观察题目不难发现“第x行第y列”的分数就是x/y,而我们要求一堆分数乘起来的积在表中的位置,就直接把分子分母分别乘到一起,然后约分就好了
by 三生万物 @ 2019-04-22 16:29:50


约分转换一下就是分子分母分别的积除以他们的最大公约数,也就是gcd(分子之积,分母之积)。如果看不懂上面那个版本可以尝试一下下面这个 ```cpp int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } ``` 可以上网查一下“辗转相除法”。。
by 三生万物 @ 2019-04-22 16:34:04


那我为啥错 ```cpp #include<cstdio> int gcd(int m,int n) { int gcd; for(int i=m- 1;;i--) { if(m%i==0 && n%i==0) { gcd=i; break; } } return gcd; } void red(int m,int n) { int g=gcd(m,n); m/=g; n/=g; } int col(int m,int n,int p,int q) { int x; int y; x=m*p; y=n*q; red(x,y); return x; } int row(int m,int n,int p,int q) { int x; int y; x=m*p; y=n*q; red(x,y); return y; } int main() { int m,n,p,q; scanf("%d/%d\n%d/%d",&m,&n,&p,&q); int f=col(m,n,p,q); int g=row(m,n,p,q); printf("%d %d",f,g); } ```
by syanoeclipse @ 2019-07-02 12:34:53


鸭蛋
by syanoeclipse @ 2019-07-02 12:35:16


|