如何打印出给定范围内的直角三角形的周长和个数?
How can I print out the perimeter and the number of right-angled triangle with a given range?
这道题需要用户输入两个值,P和Q。然后程序会输出直角整数三角形的个数以及P到Q的周长。
例如:
输入:
154 180
输出:
154 1
156 1
160 1
168 3
176 1
180 3
我想我需要找出 P-Q 范围内的勾股三元组,但是如何计算“直角三角形的数量”?
这是我的代码:
#include <iostream>
#include <math.h>
using namespace std;
int main() {
int P, Q, a, b, c, i = 0;
cin >> P >> Q;
for ( a = P; a <= Q; ++a)
{
for ( b = a; b <= Q; ++b)
{
for ( c = b; b <= Q; ++c)
{
if ((pow(a, 2) + pow(b, 2)) == pow(c, 2) && a + b + c <= Q)
{
i +=1;
cout << a + b + c << " " << i << endl;
}
}
}
}
return 0;
}
超级感谢!!
我们可以通过 std::map
以周长为键,三角形的个数为值来统计具有特定周长的直角整数三角形:
std::map<int, int> triangle_map;
接下来,利用翻转交换a
和b
的三角形的对称性,我们可以将查找搜索限制在a<=b
的情况下。
但是,如果 a==b
则 c=sqrt(2)*a
不是整数,而 a
是整数。
因此,下面的双循环搜索对我们来说很有效,可以找到所有目标三角形:
const int Qmax_a = (Q-1)/2; // 1 is the minimum value of c.
for (int a = 1; a <= Qmax_a; ++a)
{
const int a_sqr = a*a;
for (int b = a+1; b <= Q-a-1; ++b)
{
const int two_side_sqr = a_sqr + b*b;
// possible candidate
const int c = static_cast<int>(std::round(std::sqrt(two_side_sqr)));
const int perimeter = (a+b+c);
if((c*c == two_side_sqr) && (P <= perimeter) && (perimeter <= Q)){
triangle_map[perimeter] += 1;
}
}
}
最后,我们可以从生成的地图中得到想要的输出:
for(const auto& p : triangle_map){
std::cout << p.first << "," << p.second << std::endl;
}
这道题需要用户输入两个值,P和Q。然后程序会输出直角整数三角形的个数以及P到Q的周长。 例如:
输入: 154 180
输出:
154 1
156 1
160 1
168 3
176 1
180 3
我想我需要找出 P-Q 范围内的勾股三元组,但是如何计算“直角三角形的数量”? 这是我的代码:
#include <iostream>
#include <math.h>
using namespace std;
int main() {
int P, Q, a, b, c, i = 0;
cin >> P >> Q;
for ( a = P; a <= Q; ++a)
{
for ( b = a; b <= Q; ++b)
{
for ( c = b; b <= Q; ++c)
{
if ((pow(a, 2) + pow(b, 2)) == pow(c, 2) && a + b + c <= Q)
{
i +=1;
cout << a + b + c << " " << i << endl;
}
}
}
}
return 0;
}
超级感谢!!
我们可以通过 std::map
以周长为键,三角形的个数为值来统计具有特定周长的直角整数三角形:
std::map<int, int> triangle_map;
接下来,利用翻转交换a
和b
的三角形的对称性,我们可以将查找搜索限制在a<=b
的情况下。
但是,如果 a==b
则 c=sqrt(2)*a
不是整数,而 a
是整数。
因此,下面的双循环搜索对我们来说很有效,可以找到所有目标三角形:
const int Qmax_a = (Q-1)/2; // 1 is the minimum value of c.
for (int a = 1; a <= Qmax_a; ++a)
{
const int a_sqr = a*a;
for (int b = a+1; b <= Q-a-1; ++b)
{
const int two_side_sqr = a_sqr + b*b;
// possible candidate
const int c = static_cast<int>(std::round(std::sqrt(two_side_sqr)));
const int perimeter = (a+b+c);
if((c*c == two_side_sqr) && (P <= perimeter) && (perimeter <= Q)){
triangle_map[perimeter] += 1;
}
}
}
最后,我们可以从生成的地图中得到想要的输出:
for(const auto& p : triangle_map){
std::cout << p.first << "," << p.second << std::endl;
}