连分数(分数类模板) uva6875

  1 //连分数(分数类模板) uva6875
  2 // 题意:告诉你连分数的定义。求连分数,并逆向表示出来
  3 // 思路:直接上分数类模板。要注意ai可以小于0
  4
  5 #include <iostream>
  6 #include <algorithm>
  7 #include <cstring>
  8 #include <cstdio>
  9 #include <vector>
 10 #include <cmath>
 11 #include <map>
 12 #include <queue>
 13 using namespace std;
 14 #define LL long long
 15 typedef pair<int,int> pii;
 16 const int inf = 0x3f3f3f3f;
 17 const int MOD = 998244353;
 18 const int N = 1020;
 19 const int maxx = 200010;
 20 #define clc(a,b) memset(a,b,sizeof(a))
 21 const double eps = 0.025;
 22 void fre() {freopen("in.txt","r",stdin);}
 23 void freout() {freopen("out.txt","w",stdout);}
 24 inline int read() {int x=0,f=1;char ch=getchar();while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1; ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();}return x*f;}
 25
 26 struct fr{
 27     LL a,b;
 28     fr(LL a_,LL b_){
 29         LL g=__gcd(a_,b_);
 30         a=a_/g;
 31         b=b_/g;
 32     }
 33     fr operator + (const fr &x){
 34         return fr(a*x.b+b*x.a,b*x.b);
 35     }
 36     fr operator -(const fr &x){
 37         return fr(a*x.b-x.a*b,b*x.b);
 38     }
 39     fr operator *(const fr &x){
 40         return fr(a*x.a,b*x.b);
 41     }
 42     fr operator /(const fr &x){
 43         return fr(a*x.b,b*x.a);
 44     }
 45     void add(LL x){
 46         a+=b*x;
 47     }
 48     LL split(){
 49         LL r=a/b;
 50         a%=b;
 51         if(a<0){
 52             r--;
 53             a+=b;
 54         }
 55         return r;
 56     }
 57     void inv(){
 58         std::swap(a,b);
 59         if(b<0){
 60             a=-a;
 61             b=-b;
 62         }
 63     }
 64     operator bool(){
 65         return a;
 66     }
 67 };
 68 LL in[11];
 69 int n,m;
 70 int main(){
 71     int cas=1;
 72     while(~scanf("%d%d",&n,&m),n&&m){
 73         for(int i=1;i<=n;i++) scanf("%lld",&in[i]);
 74         fr x(0,1);
 75         for(int i=n;i>=1;i--) {
 76            x.add(in[i]);
 77            if(i!=1)x.inv();
 78         }
 79
 80         for(int i=1;i<=m;i++) scanf("%lld",&in[i]);
 81         fr y(0,1);
 82         for(int i=m;i>=1;i--) {
 83             y.add(in[i]);
 84             if(i!=1) y.inv();
 85         }
 86
 87         fr ad=x+y,sub=x-y,mul=x*y,div=x/y;
 88         printf("Case %d:\n",cas++);
 89
 90         ad.inv();
 91         while(ad){
 92             ad.inv();
 93             printf("%lld",ad.split());
 94             if(ad){
 95                 printf(" ");
 96             }
 97         }
 98         printf("\n");
 99
100         sub.inv();
101         while(sub){
102             sub.inv();
103             printf("%lld",sub.split());
104             if(sub){
105                 printf(" ");
106             }
107         }
108         printf("\n");
109
110         mul.inv();
111         while(mul){
112             mul.inv();
113             printf("%lld",mul.split());
114             if(mul){
115                 printf(" ");
116             }
117         }
118         printf("\n");
119
120         div.inv();
121         while(div){
122             div.inv();
123             printf("%lld",div.split());
124             if(div){
125                 printf(" ");
126             }
127         }
128         printf("\n");
129
130     }
131     return 0;
132 }
时间: 2024-10-11 17:31:44

连分数(分数类模板) uva6875的相关文章

实验11:Problem D: 分数类的模板数组类

在默认构造函数里面,分母的默认值不能为0!! Home Web Board ProblemSet Standing Status Statistics Problem D: 分数类的模板数组类 Problem D: 分数类的模板数组类 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 509  Solved: 350[Submit][Status][Web Board] Description 封装一个模板数组类Array,支持一下操作: 1. 构造函

Problem S: 分数类的模板数组类

Problem S: 分数类的模板数组类 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2155  Solved: 1624[Submit][Status][Web Board] Description 封装一个模板数组类Array,支持一下操作: 1. 构造函数Array(int n),将数组初始化为n个存储空间: 2. 函数input(int n),读取最多n个元素,但不能超过数组存储空间的上限: 3. 重载下标运算符,返回数组的元素. 封装一

ACM模板——分数类

#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i = (a);i < (b);i ++) const int maxn = 50003; int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);} int lcm(int a,int b){return a/gcd(a,b)*b;} class Fraction { public:

C++学习笔记50:队列类模板

队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h #ifndef QUEUE_H #define QUEUE_H #include <cassert> //类模板的定义 template <class T, int SIZE = 50> class Queue { private: int front, rear, count; T

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

c++类模板之间友元函数调用

1 #include <stdio.h> 2 #include <iostream> 3 4 using namespace std; 5 6 template<typename T> class BTree; 7 8 /***************************节点类模板*********************************/ 9 template<typename T> 10 class BTreeNode{ 11 friend

C++类模板的使用

面向对象: 设计和实现一个C++类模板,来提供一种采用数组来存储的.元素为任意类型的环形队.要求提供的操作:加入元素:提取元素:返回环形队允许存储的元素个数最大值:返回当前的有效元素个数. #include<iostream> #include<cstring> using namespace std; template<class Type> class Queue { private: int front; int rear; Type *item; int len

类模板

与函数模板不同的是,编译器不能为类模板推断模板参数的类型,为了使用类模板,我们必须在模板名后的尖括号中提供额外的消息---用来代替模板参数的模板实参列表.这些额外的信息是显式的模板实参列表,它们被绑定到模板参数. #include<iostream> using namespace std; template <typename T> class Parent { public: Parent(T a) { this->a = a; } virtual void printf

C++智能指针类模板

1.智能指针本质上是一个对象,这个对象可以像原生的一样来进行使用.原因是智能指针对象对应的类中,将指针相关的操作都进行了重载操作处理,所以才会达到这种像是原生的效果. 2.智能指针的意义: 现在C++开发库中最重要的类模板之一 C++中自动内存管理的主要手段 能够在很大程度上避开内存相关的问题 3.在QT中开发库中也提供了智能指针类模板,在STL标准库中也提供了,在c++的标准库忘了什么名了中也提供了智能指针类模板.所以智能指针类模板在C++中的地位很重要 4.STL中的智能指针类模板 auto