分桃子问题的算法

不住隔壁的老王 2012-05-29 05:37:19
问题:有一堆桃子,分给三组人。只分给第一组每人7个,只分给第二组 每人8个,只分给第三组每人9个。一共多少桃子?每组几个人?

我的算法太慢了,有什么好的算法?

#include <iostream>

using namespace std;

int main()
{
int n,x,y,z;

for(x=1;x<100;x++)
for(y=1;y<100;y++)
for(z=1;z<100;z++)
for(n=1;n<1000;n++)

if((n == x*7)&&(n == y*8)&&(n == z*9))
{
cout << x<< endl;
cout << y<< endl;
cout << z<< endl;
cout << n<< endl;
}
return 0;
}

...全文
195 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
waterbright 2012-05-30
  • 打赏
  • 举报
回复
四楼的意思是桃子数是7*8*9的整数倍,第一组的人数是8*9的整数倍,第二组的人数是7*9的整数倍,第三组的人数是7*8的整数倍,这样就能很明了的看出每组有多少人了。
  • 打赏
  • 举报
回复
我的垃圾CPU 只用了 0.01s 确实快
[Quote=引用 3 楼 的回复:]
哦。是我想简单了,没考虑周全。有2种解决办法:
1、思路简单点,还是用回蛮力搜索,不过代码要改改,参考这样写:
for(n=1; n<INT_MAX; n++)
if(n%7==0 && n%8==0 && n%9==0)
{
cout<<n/7<<endl;
cout<<n/8<<endl;
cout<<n/9<<endl;
……
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
桃子数7*8*9*n,n为自然数
第一组人数8*9*n,第二组人数7*9*n,第三组人数7*8*n
[/Quote]

什么意思? 好像和题意不搭啊
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
哦。是我想简单了,没考虑周全。有2种解决办法:
1、思路简单点,还是用回蛮力搜索,不过代码要改改,参考这样写:
for(n=1; n<INT_MAX; n++)
if(n%7==0 && n%8==0 && n%9==0)
{
cout<<n/7<<endl;
cout<<n/8<<endl;
cout<<n/9<<endl;
……
[/Quote]


用求模的方法 只有一个变量 算出的速度确实快多了
lwouyang 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

我的垃圾CPU 只用了 0.01s 确实快
引用 3 楼 的回复:
哦。是我想简单了,没考虑周全。有2种解决办法:
1、思路简单点,还是用回蛮力搜索,不过代码要改改,参考这样写:
for(n=1; n<INT_MAX; n++)
if(n%7==0 &amp;&amp; n%8==0 &amp;&amp; n%9==0)
{
cout<<n……
[/Quote]不会吧?再整整。
  //...
int temp = max(x, y);
x = min(x, y);
y = min(temp, z);
z = max(temp, z);
for(n = z; n < INT_MAX; n+=z)
if(n%x==0 || n%y==0){
cout<<n/x<<endl;
cout<<n/y<<endl;
cout<<n/z<<endl;
cout<<n<<endl;
}
解释下,z 取 3个整数中的最大值,其他两个给 x 和 y;以 z 的倍数递增查找,而且可以不必判断 z 的整除性。而求最小公倍数法大概如下
#include <iostream>
using namespace std;

int gcd(int a, int b)
{
int temp;
if(a < b)
{
temp = a;
a = b;
b = temp;
}
while(b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
}

int main(void)
{
int x, y, z, n;
cout<< "input 3 integers: "<<endl;
cin >> x >> y >> z;
n = gcd(x, y*z);
cout<< n/x <<endl;
cout<< n/y <<endl;
cout << n/z <<endl;
return 0;
}
以上代码仅供参考,不具备实际用途。
baichi4141 2012-05-29
  • 打赏
  • 举报
回复
桃子数7*8*9*n,n为自然数
第一组人数8*9*n,第二组人数7*9*n,第三组人数7*8*n
lwouyang 2012-05-29
  • 打赏
  • 举报
回复
哦。是我想简单了,没考虑周全。有2种解决办法:
1、思路简单点,还是用回蛮力搜索,不过代码要改改,参考这样写:
for(n=1; n<INT_MAX; n++)
if(n%7==0 && n%8==0 && n%9==0)
{
cout<<n/7<<endl;
cout<<n/8<<endl;
cout<<n/9<<endl;
cout<<n<<endl;
}
运算符 "%" 用于整型数值运算表示 求余,如果余数为零意味着整除。
2、仍求最小公倍数,相信大部分情形比蛮力搜索要快。简单的算法有用辗转相除法求最大公约数来间接求最小公倍数的。
  • 打赏
  • 举报
回复
最小公倍数我知道 如果数据量大了 如 777 * 877 * 977 程序处理会很慢的
lwouyang 2012-05-29
  • 打赏
  • 举报
回复
稍用点数学知识,7 8 9 两两互素,结果必定是7*8*9=504的倍数。这样不就行了?

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧