| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 934 人关注过本帖
标题:一个新的切 Cake 问题
只看楼主 加入收藏
Ci_Ken
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-4-15
收藏
 问题点数:0 回复次数:7 
一个新的切 Cake 问题

一次生日会,可能会有p或q个人参加,现准备了一个大蛋糕,只有1个,问最少切成多少块(不用每块大小一样),能使无论q或p个人参加,都能平均吃掉蛋糕
(切蛋糕前不知道到底是有q或p个人参加,只知道是这2种情况的人)


比如,如果有2个人或3个人参加
可以把蛋糕切分成4块
大小为3分之1,3分之1,6分之1,6分之1;


有高手能用C,or C++写吗
给个算法也可以

搜索更多相关主题的帖子: Cake 蛋糕 生日 算法 
2007-04-22 14:56
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

我想了一下哈,不知道行不:
"切蛋糕前不知道到底是有q或p个人参加,只知道是这2种情况的人",首先排除p=q的情况.
若有p或q个人参加.
1:比较p,q的大小,比如说p>q;
2:将蛋糕分成p份,那么每分都为1/p;
3:保持q个1/p不动,(p-q)个1/p每个都分成q份,也就是每份大小1/pq.

不知道说的够不够明白哈,举几个例子.
p=4,q=3;将蛋糕分成4份,那么有3个1/4,3个1/12.
p=5,q=3;1/5,1/5,1/5, 1/15,1/15,1/15,1/15,1/15,1/15
p=8,q=3;3个1/8,15个1/24
p=8,q=5;5个1/8,9个1/24

可能考虑的不够全面,大家继续讨论吧


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-04-22 19:18
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 


#include <iostream>
#include <algorithm>
using namespace std;

int gcd(int a,int b)
{
int r;
while(r=a%b){
a=b;
b=r;
}
return b;
}

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

int main()
{
int a,b,p,q,l;
while(scanf(\"%d %d\",&p,&q)!=EOF){
if(p>q){
swap(p,q);
}
l=lcm(p,q);
a=l/p;
b=l/q;
printf(\"把蛋糕切分成%d块\n\",(a-b+1)*p);
if(q==l){
printf(\"大小分别为%d个%d分之1\n\",(a-b+1)*p,l);
}
else {
printf(\"大小分别为%d个%d分之1 和 %d个%d分之1\n\",p,q,(a-b)*p,l);
}
}
}

2007-05-15 20:47
kisscjy
Rank: 1
等 级:新手上路
帖 子:217
专家分:0
注 册:2007-4-9
收藏
得分:0 

代码:(思路是由斑竹提供)
其实只要知道规律就挺简单:

#include<iostream>
using namespace std;

void main()
{
int p,q;
cout<<"输入有可能来的人个数:\n";
cin>>p>>q;

int r;
if(p>q)
{
r=p%q;
cout<<"一共需要切"<<(p-r)<<"个 1/"<<p<<" 块蛋糕,\n";

cout<<"还需要切"<<(r*q)<<"个 1/"<<(p*q)<<" 块蛋糕!\n";

}

else
{
r=q%p;
cout<<"一共需要切"<<(q-r)<<"个 1/"<<q<<" 块蛋糕,\n";

cout<<"还需要切"<<(r*p)<<"个 1/"<<(p*q)<<" 块蛋糕!\n";
}
}


每当我一晚写下70,80个程序时,你还真以为,这都是我一个人干的.....不过说真的,其实都是抄书的~~ ^@^
2007-05-16 15:34
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
回复:(kisscjy)代码:(思路是由斑竹提供)其实只要知...
对于4 6的输入,你需要切12块,我只要切8块。
2007-05-16 15:46
kisscjy
Rank: 1
等 级:新手上路
帖 子:217
专家分:0
注 册:2007-4-9
收藏
得分:0 

是我没注意到切多的问题~~~
改进了一下:

#include<iostream>
using namespace std;

void main()
{
int p,q;
cout<<"输入有可能来的人个数:\n";
cin>>p>>q;

int r;
int number;
int value;
if(p>q)
{
r=p%q;
cout<<"一共需要切"<<(p-r)<<"个 1/"<<p<<" 块蛋糕,\n";

number=r*q;
value=p*q;
if(number%q==0)
{
number=number/2;
value=value/2;
}
cout<<"还需要切"<<number<<"个 1/"<<value<<" 块蛋糕!\n";

}

else
{
r=q%p;
cout<<"一共需要切"<<(q-r)<<"个 1/"<<q<<" 块蛋糕,\n";

number=r*p;
value=p*q;
if(number%p==0)
{
number=number/2;
value=value/2;
}

cout<<"还需要切"<<number<<"个 1/"<<value<<" 块蛋糕!\n";
}
}


每当我一晚写下70,80个程序时,你还真以为,这都是我一个人干的.....不过说真的,其实都是抄书的~~ ^@^
2007-05-16 16:53
kisscjy
Rank: 1
等 级:新手上路
帖 子:217
专家分:0
注 册:2007-4-9
收藏
得分:0 
以下是引用leeco在2007-5-15 20:47:49的发言:


#include <iostream>
#include <algorithm>
using namespace std;

int gcd(int a,int b)
{
int r;
while(r=a%b){
a=b;
b=r;
}
return b;
}

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

int main()
{
int a,b,p,q,l;
while(scanf(\"%d %d\",&p,&q)!=EOF){
if(p>q){
swap(p,q);
}
l=lcm(p,q);
a=l/p;
b=l/q;
printf(\"把蛋糕切分成%d块\n\",(a-b+1)*p);
if(q==l){
printf(\"大小分别为%d个%d分之1\n\",(a-b+1)*p,l);
}
else {
printf(\"大小分别为%d个%d分之1 和 %d个%d分之1\n\",p,q,(a-b)*p,l);
}
}
}

刚刚研究了一下,发现你和我的代码都有点问题~~~
比如4,7,
你要切4个1/7和12个1/28,一共16次
但其实可以切成
4个1/7,4个1/14,4个1/28,这样只要切12次


每当我一晚写下70,80个程序时,你还真以为,这都是我一个人干的.....不过说真的,其实都是抄书的~~ ^@^
2007-05-16 17:03
幸福等待
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-17
收藏
得分:0 
#include<stdio.h>

int gongbeishu(int n,int m)
{
    int c=m%n;
    while(c!=0)
    {
        m=n;
        n=c;
        c=m%n;
    }
    return n;
}
int daxiao(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int n,m;
    int min;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n>m)
        {
            min=daxiao(n-m,gongbeishu(m,n));
            printf("%d\n",n-gongbeishu(m,n)+min*m/gongbeishu(m,n));
        }
        else
        {
            min=daxiao(m-n,gongbeishu(n,m));
            printf("%d\n",m-gongbeishu(n,m)+min*n/gongbeishu(n,m));
        }
    }
    return 0;
}

这个代码哪里有问题啊 真是麻烦啊
2011-05-17 19:34
快速回复:一个新的切 Cake 问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062564 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved