五家共井 C++ 求高手解答我的程序错在哪?

五家共井问题:五家共井,甲二绠(井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。问井深、绠长各几何?(求一组最小整数解)
解答如下:

#include<iostream>
using namespace std;
int main()
{
int depth,a,b,c,d,e;
for(depth=1;;depth++)
for(a=1;a<=depth;a++)
for(b=1;b<=depth;b++)
for(c=1;c<=depth;c++)
for(d=1;d<=depth;d++)
for(e=1;e<=depth;e++)
if(2*a+b==depth && 3*b+c==depth && 4*c+d==depth && 5*d+e==depth && 6*e+a==depth) break;
cout << depth << a << b << c << d << e << endl;
return 0;
}
我调试之后算了半天没出结果,问题在哪???

有两个问题。首先外层循环没有终止条件,这样的话,最后这个if语句仅仅是从最后一个循环跳出到倒数第二个循环中。之后内层循环都结束了,外层循环还是无法终止,因此会死循环下去。解决办法是设置一个bool型的flag变量,作为最外层的循环结果。

还有一个问题是嵌套层次太多,理解不易且浪费了大量时间。其实对于多元一阶方程组,约束关系很简单的,可以用两层循环解决。

这里有一个参考,你研究一下:

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

int main()
{
bool found = false;
int depth,a,b,c,d,e;

for ( depth = 1; !found ;++depth)
{
for ( a = 1; a < depth ; ++a )
{
b = depth - 2 * a;
c = depth - 3 * b;
d = depth - 4 * c;
e = depth - 5 * d;
if ( b > 0 && c > 0 && d > 0 && e > 0 && 6 * e + a == depth )
{
found = true;
cout << depth << ", " << a << ", " << b << ", " << c << ", " << d << ", " << e << endl;
break;
}
}

}
}追问

问题下用break跳出的是最后一个循环还是全部的?
如果要跳出全部的难道要5个break么,我也试过了也不对啊?

追答

你这是6个循环啦,得6个break,如果你非要这么做的话。
关键还是循环次数太多了,按照你的迭代方式,估计要等很久才能出结果吧。。你这是O(n^6)的复杂度了啊。。

追问

不好意思继续追问。。应该是一个break就可以了的,因为再打break上去就显示 illegal break了。。可能问题是复杂度太高了吧,算了很久没出结果,呵呵

追答

你要增加新的break就要加新的if,同时要用大括号把各个层次的for循环包括起来才行。直接加break肯定是不行的啊。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-02
你出现了死循环,for(depth=1;;depth++)
这里没有循环终止条件!追问

但是我不是用break跳出循环了么,题目没有给循环终止条件啊?

第2个回答  2011-10-02
能不能解释一下题目,好迷茫啊看着
相似回答