我一直得到 c 的负数,b 只打印 23,a 正常循环。当我将其放入周边时,至少输出加起来为 24。我觉得我只是一些愚蠢的逻辑错误。 我的代码如下。
写一个程序找出边长为整数的所有三角形和一个用户 指定的周长。您的程序应该找到所有三元组 a、b 和 c,其中 a + b + c 是用户指定的周长值。
1 #include <stdio.h>
2
3 int main() {
4 int p, a, b, c;
5 printf("Enter a perimeter: ");
6 scanf("%d", &p);
7
8 printf("Triangles with a perimeter: " " %d\n", p);
9
10 for(a = 1; a < p; a++) {
11 for(b = a; b < p; b++)
12 c = p - (a + b);
13 b = p - (a + c);
14 a = p - (b + c);
15
16 printf("%d, %d, %d\n",a,b,c);
17
18 }
19 return 0;
20 }
我认为这更像是一个面试问题,而不是初学者问题。
最佳答案
原始代码中有几处错误。有些与使三角形成为三角形的原因有关,有些与基本逻辑出错有关。
for (a = 1; a < p; a++)
是错误的,因为三角形的一侧不能长于周长的一半。即使在周长的一半处,也会形成 2 条线,而不是三角形。
for (b = 1; b < (p - a); b++)
是错误的,因为 a+b
开始时将小于周长的一半。
c
是根据p
的值计算的, a
和 b
.
c = p - (a + b);
计算b
的意义何在?和 a
?
b = p - (a + c);
a = p - (b + c);
作为Jonathan Leffler指出,代码应该只打印唯一的三角形。这可以通过添加条件 a<=b && b<=c
轻松实现。在 printf
之前声明。
感谢@JonathanLeffler 花时间调试这段简短的代码。发现一个错误导致代码由于 b
而跳过一些输出被初始化为一个更高的值,以及提前终止循环的内部 for 循环条件。
这是代码的更正版本。
#include <stdio.h>
int main() {
int p, a, b, c;
printf("Enter a perimeter: ");
scanf("%d", &p);
printf("Triangles with a perimeter: " " %d\n", p);
for (a = 1; 2*a < p; a++) {
for (b = 1; a+b < p; b++)
if ((p-2*a) > 0 && (p-2*b) > 0 && (2*a+2*b-p) > 0) {
c = p - (a + b);
if(a<=b && b<=c)
printf("%d, %d, %d\n", a ,b, c);
}
}
return 0;
}
现在让我们试试吧。
Enter a perimeter: 6
Triangles with a perimeter: 6
2, 2, 2
没错。一个有周长的三角形 6
只有 1
可能的组合。 1, 1, 4
单位长边不会是三角形,除非你愿意弯曲 4
的边单位长。
Enter a perimeter: 12
Triangles with a perimeter: 12
2, 5, 5
3, 4, 5
4, 4, 4
关于C 从周长找出三角形所有可能的边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035818/