C++while嵌套while不跳出

想写一段输出abc的程序,ab为100以内的正整数,c为(a^2+b^2)^(1/2)且c<=100.#include<iostream>intmain(){inta=0... 想写一段输出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;
}
运行结果只是运行了第二个循环,不知道是什么原因。
展开
 我来答
jaky03066
2014-11-24
知道答主
回答量:9
采纳率:0%
帮助的人:3.3万
展开全部
你的判断条件有问题 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)就足够了,这样算法的效率会好很多。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不愿相离
2014-11-24 · TA获得超过440个赞
知道小有建树答主
回答量:529
采纳率:0%
帮助的人:494万
展开全部
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输出
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
杨烨杨叶
2014-11-24 · TA获得超过4252个赞
知道大有可为答主
回答量:4958
采纳率:33%
帮助的人:2491万
展开全部
#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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Metaphor90
2014-11-24 · TA获得超过202个赞
知道小有建树答主
回答量:146
采纳率:0%
帮助的人:132万
展开全部

稍简化了一下,供参考:

#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wnself_live_cn
2014-11-24 · TA获得超过117个赞
知道答主
回答量:89
采纳率:75%
帮助的人:47.6万
展开全部
b=b+1;放到if外面就好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式