Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144558
  • 博文数量: 66
  • 博客积分: 1571
  • 博客等级: 上尉
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:55
文章分类

全部博文(66)

文章存档

2012年(66)

我的朋友

分类: C/C++

2012-08-24 11:07:44

Cake (抽象出欧几里得)

Cake Problem Description一次生日Party可能有p人或者q人参加,现准备有一个大蛋糕.问最少要将蛋糕切成多少块(每块大小不一定相等),才能使p人或者q人出席的任何一种情况,都能平均将蛋糕分食. 
Input

每行有两个数p和q. 
Output
输出最少要将蛋糕切成多少块. 
Sample Input2 3 
Sample Output4 Hint将蛋糕切成大小分别为1/3,1/3,1/6,1/6的四块即满足要求. 当2个人来时,每人可以吃1/3+1/6=1/2 , 1/2块。当3个人来时,每人可以吃1/6+1/6=1/3 , 1/3, 1/3块。 
AuthorLL 

题目意思很清楚,不用多说,公式是 p+q-gcd(p,q)

举个例子:4 6,用一个矩形来切割,如下图





蓝色点线表示4等分线 红色实线表示6等分线,让蛋糕(矩形)可以平分为4份需要(4刀)和6份需要(6刀),总共需要10刀,但因为其中有两条线是重合的,没有必要切两次,所以应该减掉这两刀,就只剩下

10-2=8刀了。对于任何p和q,他们重合的线的数量就是他们的GCD,所以就~~~~~


 

点击(此处)折叠或打开

  1. 实现1,普通的循环,Exe.Time=15ms Code.len=338B
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int maxy(int m,int n)
  5. {
  6.     int r;
  7.     if(m<n)
  8.     {
  9.         r=m;
  10.         m=n;
  11.         n=r;
  12.     }
  13.     do
  14.     {
  15.        r=m%n;
  16.        m=n;
  17.        n=r;
  18.        }while(n!=0);
  19.        return (m);
  20. }
  21. int main()
  22. {
  23.     int p,q;
  24.     while(scanf("%d %d",&p,&q)!=EOF)
  25.     {
  26.         printf("%d\n",p+q-maxy(p,q));
  27.     }
  28.      return 0;
  29. }


 

点击(此处)折叠或打开

  1. 实现2,递归函数,Exe.Time=218ms,Code.len=259B
  2. #include <iostream>
  3. #include <math.h>
  4. using namespace std;

  5. int gcd(int a, int b) {
  6.     /*如果a>b,b可能是最大公约数,去除a中能被b整出余下的部分a1如果a1!=0,说明b不是gcd,继续
  7.      则b>a1 ,a1可能是最大公约数,继续直到an=0说明此时的b=0,a中保存了gcd*/
  8.       /*如果a<b,则第一次gcd(b, a%b)边实现了他们的交换*/

  9.     return b ? gcd(b, a%b) : a;
  10. }

  11. int main() {
  12.     int p, q;
  13.     while(cin>>p>>q) {
  14.         cout << p + q - gcd(p, q) << endl;
  15.     }
  16.     
  17.     return 0;
  18. }



 

阅读(1485) | 评论(0) | 转发(0) |
0

上一篇:最小公倍数

下一篇:Largest prime factor

给主人留下些什么吧!~~