C++while嵌套while不跳出

想写一段输出a b c的程序,a b为100以内的正整数,c为(a^2+b^2)^(1/2)且c<=100.

#include<iostream>
int main()
{
int a = 0, b = 1, n;
double c;
while (a <= 100)
{
a = a + 1;
while (b <= 100)
{
n = a*a + b*b;
c = sqrt(n);

if (c <= 100)
{
std::cout << a << " " << b << " " << c
<< std::endl;
b = b + 1;
}

}
}
return 0;
}
运行结果只是运行了第二个循环,不知道是什么原因。

第1个回答  2014-11-24
你的判断条件有问题 while(b<=100)这里,是永远跳不出的,你想下,当b加到100时,n为10001,10000的开根是100,所以n的开根是大于100的,即c大于100,所以不会进到if(c<=100)条件中,因此b不会再加,所以b一直为100,因此不会跳出while(b<=100)条件。这是一死循环代码。还不明白的话可以提问

代码(有注释,应该很容易理解)
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int a=1,b=1;
double c;
while(a<=100)
{
//初始化b,不然的话b是101,永远大于100,是不会进入下面的while循环的
//这回导致我们不能看到,如a=2,b=1(等等等)的情况
b=1;
while(b<=100)
{
c=(int)sqrt(a*a+b*b); //取整
if(c<=100)
{
cout<<"a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
}
b=b+1;
}
a=a+1;
}
return 0;
}追问

我想通过这个程序把100以内的勾股数找出来,但为什么输出的c不是(a^2+b^2)^(1/2)?而且由于条件问题,输出的a也到了99。要是想要找出100以内的勾股数还应该怎样修改一下程序?请您指点一下。

追答

但为什么输出的c不是(a^2+b^2)^(1/2)? 因为你要求C是整数,所以取整了(取整肯定会出现误差)你可以把:c=(int)sqrt(a*a+b*b); 中的(int)去掉,然后把cout<<"a: "<<a<<" b: "<<b<<" c: "<<c<<endl;这句代码改成cout<<"a: "<<a<<" b: "<<b<<" c: "<<(int)c<<endl;结果会更符合题意。 你要求100以内的勾股数,很简单呀! 把取整那句改成c=a*a+b*b,然后 判断 是否小于等于100,符合就输出呀,不过while(a<=100)和while(b<=100)应该改成while(a<=10)和while(b<=10)就足够了,这样算法的效率会好很多。

第2个回答  2014-11-24
1、while (b <= 100)前应该加一句b=1;否则你第一次结束后b就大于100,后面就不会进入while(b <= 100)循环

2、把b = b + 1;放到if (c <= 100)后面,你放在里面的话如果c不满条件,会一直在里面死循环的追问

那个b=1很关键啊
请问如果要让输出的c为整数要添加什么语句?

追答

std:cout<<(int)c 把double强制转换成int输出

追问

我想通过这个程序把100以内的勾股数找出来,但为什么输出的c不是(a^2+b^2)^(1/2)?而且由于条件问题,输出的a也到了99。要是想要找出100以内的勾股数还应该怎样修改一下程序?麻烦您了。

追答
int main()
{
int a,b,c,n=0;
for(a=1;a<=100;a++)
for(b=1;b<=100;b++)
for(c=1;c<=100;c++)
if(((a*a+b*b)==c*c)&&(a<b&&b<c))
{
cout<<a<<" "<<b<<" "<<c<<endl;
n++;
}
cout<<n<<endl;
return 0;
}

按照我自己的理解写的,你自己验证下吧

本回答被提问者采纳
第3个回答  2014-11-24
#include<iostream>
#include <math.h>
int main()
{
int a = 0, b = 1, n;
double c;
while (a <= 100)
{
a = a + 1;
while (b <= 100)
{
n = a*a + b*b;
c = sqrt(n);

if (c <= 100)
{
std::cout << a << " " << b << " " << c
<< std::endl;
b = b + 1;
}
else
b=b+1;//b==100时,因为c>100,所以上面的内层循环陷入死循环了,得让它能跳出循环;

}
b=1;//跳出循环后,这时候需要把b恢复到1,然后a加1,重新开始循环
}
getchar();
return 0;
}本回答被网友采纳
第4个回答  2014-11-24

稍简化了一下,供参考:

#include<iostream>
int main()
{
double result;
for (int i = 1; i < 100; ++i)
{
for (int j = 1; j < 100; ++j)
{
result = sqrt(i*i + j*j);
if (result <= 100)
std::cout << i << " " << j << " " << result << std::endl;
}
}

return 0;
}

第5个回答  2014-11-24
b=b+1;放到if外面就好了
相似回答