c语言问一个三角公式

时间:2018-10-01 08:37:44

标签: c

编写一个程序,当您想通过输入三角形三边的长度之和来创建三角形时,输出可能三角形的边长和三角形数。(整数变量。) (三角形两侧的长度之和大于另一侧的长度)

例如:

Sum of three sides: 6

 1 3 2\n
 2 2 2\n
 2 3 1\n
 3 1 2\n
 3 2 1\n


number of triangle: 5

我的代码:

#include <stdio.h>

int main() {

    int a = 0, b = 0, c = 0, count=0;
    int sum = a + b + c;


    printf("Sum of three sides: ");
    scanf_s("%d", &sum);

    for (a = 1; a < sum; a++)
        for (b = 1; b < sum; b++)
            for (c = 1; c < sum; c++)

                if (a + b > c && a+b+c==sum)

                    printf("%d\t %d\t %d\n", a, b, c);


                    printf("number of triangle: %d", count );

}

我不知道如何输出三角形数量以及如何放置  代码中写出“三角形的两个边的长度之和大于另一边的长度”。

4 1 1不是有效的三角形。 a + b > c是三角形公式。

4 个答案:

答案 0 :(得分:1)

正如评论/答案中所指出的那样,主要问题是您的代码仅检查a + b > c的位置,以确保“ <两边之和大于”的所有所有组合最后一面”。

此外,没有理由使用3个循环。通过外部两个循环选择ab时,可以像c一样计算c = sum - a - b。像这样:

#include <stdio.h>

int main() {

    int a, b, c, count=0;
    int sum;

    printf("Sum of three sides: ");
    scanf_s("%d", &sum);

    for (a = 1; a < sum; a++)
    {
        for (b = 1; b < sum; b++)  
        {
            c = sum - a - b;
            if (c < 1) break; // No reason to continue so break out of inner loop

            if ((a + b > c) && (a + c > b) && (b + c > a))
            {
                printf("%d\t %d\t %d\n", a, b, c);
                ++count;
            }
        }
    }
    printf("number of triangle: %d", count );
    return 0;
}

您可以通过考虑循环的条件来进一步提高程序性能:

    for (a = 1; a < sum; a++)

真的有必要一路继续前进到sum - 1吗?

是否会存在一个a大于或等于sum/2的三角形?

答案 1 :(得分:0)

您必须检查所有三个方面的条件,并且必须递增count才能成功进行测试。

#include<stdio.h>
#include<stdlib.h>

int main() {

    int a = 0, b = 0, c = 0, count=0;
    int sum = a + b + c;

    printf("Sum of three sides: ");
    scanf("%d", &sum);

    for (a = 1; a < sum; a++)
        for (b = 1; b < sum; b++)
            for (c = 1; c < sum; c++)
                if ((a+b+c==sum) && ((a + b > c) && (a + c > b) && (c + b > a)))
                {
                    printf("%d\t %d\t %d\n", a, b, c);
                    count++;
                }
    printf("number of triangles: %d", count );
}

输出:

Sum of three sides: 6
2        2       2
number of triangle(s): 1


Sum of three sides: 7
1        3       3
2        2       3
2        3       2
3        1       3
3        2       2
3        3       1
number of triangle(s): 6

答案 2 :(得分:0)

您的代码在任何地方都不会增加count变量。整个过程都保持不变。另外,您只检查一侧的有效性,而不是所有侧的条件是否满足。

而且,您的示例输出错误 [1 3 2],[2 3 1],[3 1 2],[3 2 1] ,等是不是有效三角形。只有[2,2,2]满足三角形条件。 请先交叉检查预期的输出,然后再将其作为必需项发布在这里。

这是可能的工作代码:

#include<stdio.h>

int main() {

    int a = 1, b = 1, c = 1, count=0;
    int sum = 0;

    printf("Sum of three sides: ");
    scanf("%d", &sum);

    while(a < sum) {
      b=1;
        while(b < sum) {
          c=1;
            while(c < sum) {
                if ((a+b+c == sum)&&(a+b>c)&&(a+c>b)&&(c+b>a))
                {
                  count+=1;
                  printf("Triangle %d:\nSide 1: %d   Side 2: %d   Side 3: %d\n\n", count, a, b, c);
                }
              c++;
            }
          b++;
        }
      a++;
    }
    printf("Possible number of triangles: %d", count );
    return(0);
}

答案 3 :(得分:0)

可以通过添加&& a来改进条件((a + b + c == sum)&&((a + b> c)&&(a + c> b)&&(c + b> a))) <= b && b <= c避免生成双三角形。例如3 3 1与3 1 3和1 3 3相同。 (我之所以回答这个问题是因为我没有足够的声誉来发表评论。)