gmoj_junior——1719. 【10.4NOIP普及模拟】小x的极限题解

题目大意:

给定A数组和B数组,按照


的方式
问P(x)/Q(x)化简为最简为何(P/Q的形式)(其中x=∞)

数据范围:0≤n,m≤100,|ai|,|bi|<105

思路:

当你手玩了好几个样例后,会发现好像只跟a0与b0(及最高项)有关(其实是2+∞=∞2
因为答案可为正负无穷(infinity)、0(0/1)或可化最简形式
所以再分类讨论三种情况(要多结合草稿本):

(1)“Infinity”情况:

仔细观察前两个样例,化简后会留有底数x

所以我们可以猜想出:“Infinity”的情况是要有x

根据此猜想,显然当n>m满足如上条件

(2)“0/1”情况

仔细观察第三个样例,化简后为分式

所以猜想:“0/1”情况为分式

什么情况下才能会有分式呢?

显然当n<m时

    (3)可化简情况(只有当n=m时)

仔细观察第四、五个样例,答案只与最高项的项数有关

因为答案要约分,所以容易想到用gcd来实现

结合上述,输出答案约分后的即可

代码实现:

 1 #include <cstdio>
 2 
 3 const int N = 1e2 + 5;
 4 
 5 using namespace std;
 6 
 7 int n, m;
 8 
 9 int p[N], q[N];//数组定义
10 
11 int main(){
12 //    freopen("limit.in", "r", stdin);
13 //    freopen("limit.out", "w", stdout);
14     scanf("%d%d", &n, &m);
15     int x = n, y = m;
16     if (n < m) return printf("0/1"), 0;//0/1情况
17     for (int i = 0; i <= n; i ++) scanf("%d", &p[i]);
18     for (int i = 0; i <= m; i ++) scanf("%d", &q[i]);
19     n = p[0], m = q[0];
20     if (x > y){
21         if (n < 0 and m < 0) return printf("Infinity"), 0;//注意同号得正
22         if (n < 0 or m < 0) return printf("-Infinity"), 0;
23         else if (n > 0 and m > 0) return printf("Infinity"), 0;
24     }
25     //Infinity情况
26     if (n < 0 and m < 0) n = -n, m = -m;
27     if (n < 0) n = -n, printf("-");
28     if (m < 0) m = -m, printf("-");
29     //负号判断
30     int r = n % m, n1 = n, m1 = m;
31     while (r != 0){
32         n1 = m1;
33         m1 = r;
34         r = n1 % m1;
35     }
36     //gcd约分
37     return printf("%d/%d", n / m1, m / m1), 0;
38 }
View Code

完结散花owo

posted @ 2022-01-24 21:33  2021彭杨铄  阅读(47)  评论(0)    收藏  举报