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 }
完结散花owo

浙公网安备 33010602011771号