Fun With Fractions
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB
Total submit users: 152, Accepted users: 32
Problem 12878 : No special judgement
Problem description

A rational number can be represented as the ratio of two integers, referred to as the numerator (n) and the denominator (d) and written n/d. A rational number's representation is not unique. For example the rational numbers 1/2 and 2/4 are equivalent. A rational number representation is described as "in lowest terms" if the numerator and denominator have no common factors. Thus 1/2 is in lowest terms but 2/4 is not. A rational number can be reduced to lowest terms by dividing by the greatest common divisor of n and d.
Addition of rational
numbers is defined as follows. Note that the right hand side of this equality
will not necessarily be in lowest terms.

A
rational number for which the numerator is greater than or equal to the
denominator can be displayed in mixed format, which includes a whole number part
and a fractional part.
For example, 51/3 is a mixed format representation of
the rational number 16/3. Your task is to write a program that reads a sequence
of rational numbers and displays their sum.

Input

Input will consist of specifications for a series of tests. Information for
each test begins with a line containing a single integer 1 <= n < 1000
indicating how many values follow. A count of zero terminates the input.
The
n following lines each contain a single string with no embedded whitespace .
Each string represents a rational number, which could be in any of the following
forms and will not necessarily be in lowest terms (w, n, and d are integers: 0
<= w,n < 1000, 1 <= d < 1000).
• w,n/d: a mixed number equivalent
to the rational number (w*d + n) / d.
• n/d: a rational number with a zero
whole number part
• w: a whole number with a zero fractional
part

Output

Output should consist of one line for each test comprising the test number
(formatted as shown) followed by a single space and the sum of the input number
sequence. The sum should be displayed in lowest terms using mixed number format.
If either the whole number part or the fractional part is zero, that part should
be omitted. As a special case, if both parts are zero, the value should be
displayed as a single 0.

Sample Input
2
1/2
1/3
3
1/3
2/6
3/9
3
1
2/3
4,5/6
0
Sample Output
Test 1: 5/6
Test 2: 1
Test 3: 6,1/2
Problem Source
HNU Contest 

Mean:

给你n个数,其中包含分数、整数,对这n个数求和。

analyse:

按照题目意思模拟即可,主要考察coding能力.

Time complexity:O(n)

Source code:

//Memory   Time
//  K      MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 1005
#define LL long long
using namespace std;
int n,kase=;
int flag[MAX];
char str[MAX][];
void read()
{
   memset(flag,,sizeof(flag));
   for(int i=;i<=n;i++)
   {
       scanf("%s",str[i]);
       int len=strlen(str[i]);
       for(int j=;j<len;j++)
       {
           if(str[i][j]==',')
           {
               flag[i]=;
               break;
           }
           else if(str[i][j]=='/')
           {
               flag[i]=;
               break;
           }
       }
   }
}

int gcd(int a,int b)
{
   if(b==)
       return a;
   else return gcd(b,a%b);
}

int lcm(int a,int b)
{
   int x=gcd(a,b);
   return a*b/x;
}

void solve()
{
   int num;
   int zi=,mu=;
  for(int i=;i<=n;i++)
  {
       int a,b;
      if(flag[i]==)   //  6
      {
          sscanf(str[i],"%d",&num);
          zi+=mu*num;
          continue;
      }
      else if(flag[i]==)    //  6,5/3
      {
          sscanf(str[i],"%d,%d/%d",&num,&a,&b);
          zi+=mu*num;
      }
      else     // 5/3
      {
          sscanf(str[i],"%d/%d",&a,&b);
      }
      int newmu=lcm(mu,b);
      int newa=(newmu/b)*a;
      int newzi=(newmu/mu)*zi;
      zi=newzi+newa;
      mu=newmu;
      if(zi%mu==)
      {
          zi=zi/mu;
          mu=;
          continue;
      }
  }
  zi-=mu;
  if(gcd(zi,mu)!=)
  {
      int tmp=gcd(zi,mu);
      zi/=tmp;
      mu/=tmp;
  }
  if(zi==||mu==)
  {
      puts("0");
      return ;
  }
  if(zi>=mu)
  {
      if(zi%mu==)
      {
          printf("%d\n",zi/mu);
          return ;
      }
      else
      {
          int integer=;
          while(zi>mu)
          {
              zi-=mu,integer++;
          }
          printf("%d,%d/%d\n",integer,zi,mu);
          return ;
      }
  }
  else
   printf("%d/%d\n",zi,mu);
}

int main()
{
//    freopen("cin.txt","r",stdin);
//    freopen("cout.txt","w",stdout);
   while(~scanf("%d",&n),n)
   {
       read();
       printf("Test %d: ",kase++);
       solve();
   }

return ;
}

模拟 --- hdu 12878 : Fun With Fractions的更多相关文章

  1. [模拟] hdu 4452 Running Rabbits

    意甲冠军: 两个人在一个人(1,1),一个人(N,N) 要人人搬家每秒的速度v.而一个s代表移动s左转方向秒 特别值得注意的是假设壁,反弹.改变方向 例如,在(1,1),采取的一个步骤,以左(1,0) ...

  2. [ACM_模拟] HDU 1006 Tick and Tick [时钟间隔角度问题]

    Problem Description The three hands of the clock are rotating every second and meeting each other ma ...

  3. 优先队列 + 模拟 - HDU 5437 Alisha’s Party

    Alisha’s Party Problem's Link Mean: Alisha过生日,有k个朋友来参加聚会,由于空间有限,Alisha每次开门只能让p个人进来,而且带的礼物价值越高就越先进入. ...

  4. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

  5. HDU 5912 Fraction 【模拟】 (2016中国大学生程序设计竞赛(长春))

    Fraction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  6. HDU 5102 The K-th Distance(模拟)

    题意:输入一棵树,输出前k小的点对最短距离dis(i,j)的和. 模拟,官方题解说得很清楚了.不重复了. http://bestcoder.hdu.edu.cn/ 需要注意的是,复杂度要O(n+k), ...

  7. hdu 5071(2014鞍山现场赛B题,大模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 思路:模拟题,没啥可说的,移动的时候需要注意top的变化. #include <iostr ...

  8. HDU 5510---Bazinga(指针模拟)

    题目链接 http://acm.hdu.edu.cn/search.php?action=listproblem Problem Description Ladies and gentlemen, p ...

  9. HDU 5047 Sawtooth(大数模拟)上海赛区网赛1006

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 解题报告:问一个“M”型可以把一个矩形的平面最多分割成多少块. 输入是有n个“M",现 ...

随机推荐

  1. Linux及文件系统基本介绍

    Linux及文件系统基本介绍 1   互联网行业现状 在服务器端市场: 超级计算机 2014年11月的数据显示前500系统中的485个系统都在运行着 Linux 的发布系统,而仅仅只有一台运行着 Wi ...

  2. Angular Input格式化

    今天在Angular中文群有位同学问到:如何实现对input box的格式化.如下的方式对吗? <input type="text" ng-model="demo. ...

  3. Angular实现递归指令 - Tree View

    在层次数据结构展示中,树是一种极其常见的展现方式.比如系统中目录结构.企业组织结构.电子商务产品分类都是常见的树形结构数据. 这里我们采用Angular的方式来实现这类常见的tree view结构. ...

  4. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  5. HyperDock,让Mac的窗口飞

    三年前写了一篇文章,介绍了Windows 7下的Aero效果,其实最终是想引出来写Mac OS上能产生类似功能的HyperDock应用程序,可惜这一拖,就拖到连Windows 10都快要发布了.没有关 ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...

  7. servlet到底是什么?

    Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序.指任何实现了这个Servlet接口的类或者实现Servlet接口的类,当然或者实现接口继承方 ...

  8. Infinispan 8 中新的 Redis 缓存存储实现

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/147.html nfinispan 8 包含了一个新的在 Redis k/ ...

  9. 爱上MVC系列~前端验证与后端数据有效性验证

    回到目录 有一句话,在10年前就是真理,到现在也一直都是,“前端验证可以没有,但后端验证必须要有”,这句话相信大家都没有意见吧,前端验证一般指通过JS方式实现的,友好的,个性的验证方式,而后端验证是指 ...

  10. Linux下MakeFile初探

    make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单 ...