CodeForces - 305B —— Continued Fractions

题目大意

连分数.png

本题给我们一个分数p/q,再给我们n个数字a1,a2,a3.....an。问p/q是否等于这n个数构成的连分数。由于数据很大所以肯定用long long最好用cin,cout。(本题单组数据)

样例输入

9 4
2
2 4

9 4
3
2 3 1

9 4
3
1 2 4

样例输出

YES
YES
NO

题目分析

一开始想复杂了。以为有什么公式,后来看了别人的代码才知道只需要p/q-a1(分数形式)=后面的东西。然后在把等号两边同时分子分母交换,这样右边又变成了整数加分数的形式,然后再重复同样的操作一共n次,若最后相减的结果为0则判断YES,否则判断NO。

其他问题

1.这个题由于数据很大,直接把等号右边的数据相加再和p/q比较是不靠谱的,会溢出数据(就算是LL)。而相减的话思路也会更简单。
2.在每次执行操作之前一定要判断两点,第一是若是分母为0了就出问题了肯定可以退出了,因为再按照通分相减计算会出问题,再者,本来分母就不能为0。第二也是很重要的一点就是再执行操作之前一定好判断p/q是否是小于要减的那个数ai,如果小于,肯定不能,因为第一这样p/q会被减成负数,答案不成立。第二由于我们是p - (q×ai)如果操作之后再判断在数据非常大的情况下q×ai会溢出数据,从而会错判。

代码如下
#include
#include
#include
#include
#include
#define LL long long
using namespace std;
LL num[100];
int main()
{
    LL p,q,x;
    cin >> p >> q >> x;
    for(int i = 0 ; i < x ; i++)
        cin >> num[i];
    bool flag = true;
    for(int i = 0 ; i < x ; i++)
    {
         if( q == 0  || (p/q)

你可能感兴趣的:(CodeForces - 305B —— Continued Fractions)