下面的代碼應該已經計算出可以從 1 到 N 的 3 個整數的每個三元組組成的三角形數量。但是,當我輸入 5 時,它給了我 34,而正確答案是 3:唯一可能的三角形是 ( 2, 3, 4), (2, 4, 5) 和 (3, 4, 5)。
// C code to count the number of possible triangles using
#include <stdio.h>
int main()
{ int N, count=0;
setvbuf(stdout, NULL, _IONBF, 0);
printf("Please input the value of N: \n");
scanf("%d", &N );
for (int i = 1; i < N; i ) {
for (int j = 1; j < N; j ) {
// The innermost loop checks for the triangle
// property
for (int k = 1; k < N; k ) {
// Sum of two sides is greater than the
// third
if (i j > k && i k > j && k j > i)
{
count ;
}
}
}
}
printf ("Total number of triangles possible is %d ",count);
return 0;
}
uj5u.com熱心網友回復:
您不能確保這些數字是不同的。
您可以通過正確選擇回圈限制來做到這一點:
for (int i = 1; i <= N-2; i ) {
for (int j = i 1; j <= N-1; j ) {
for (int k = j 1; k <= N; k ) {
開始每個內回圈,比外回圈的當前計數器高一。將每個回圈運行到N. 如果它們必須是不同的,你可以停在N-2, N-1, N
這會在數量增加的情況下創建三倍。如果你考慮三角形(3,4,5)和(4,3,5)不同,我們還必須考慮這些三元組的排列。由于所有值都是不同的,因此對于在內部回圈中找到的每個三元組,我們有 6 種可能的排列。
uj5u.com熱心網友回復:
對不起,我無法發表評論,所以讓我們尋求答案。我真的不明白你想要做什么。據我了解,您希望列印: 1, 2, 3, 4, 5-> [2, 3, 4], [2, 4, 5], [3, 4, 5] -> 3
除了,使用您的代碼,您將永遠不會檢查您的 N,因為當 i 變成 N 時您會退出回圈。
此外,您的“j”和“k”不必從 1 開始移動,因為您已經用“i”嘗試過該位置,因此您只會得到雙倍數。
編輯:更智能代碼的一些更改(我洗掉了我的 1,但去檢查“<=”,我個人不喜歡 :)):
// since [1, 2, 3] can't bring any triangle
if (N < 4) return 0;
// since there is no possible triangle with 1 as a border, start at 2
for (int i = 2; i <= N-2; i ) {
for (int j = i 1; j <= N-1; j ) {
// The innermost loop checks for the triangle
// property
for (int k = j 1; k <= N; k ) {
// Sum of two sides is greater than the
// third
// simplified as suggested by S M Samnoon Abrar
if (i j > k)
{
count ;
}
}
}
uj5u.com熱心網友回復:
您需要執行以下操作:
- 通過 1 到 N 運行第一個回圈,即:
1 <= i <= N - 不要從索引 1 開始每個嵌套回圈。因此,您需要運行 range 中的第一個嵌套回圈和 range 中的
i 1 <= j <= N第二個嵌套回圈j 1 <= k <=N。
解釋
- 首先,如果您運行從 1 到 N 的所有 3 個回圈,那么您不會進行不同的計數,因為該范圍內的所有數字都將被迭代 3 次。所以它會給出不正確的結果。
- 其次,由于我們只需要計算不同的數字,因此
1每次從前一個外回圈開始計算是有效的。通過這種方式,我們確保我們不會對任何數字進行兩次迭代。
檢查以下代碼:
// C code to count the number of possible triangles using
#include <stdio.h>
int main()
{ int N, count=0;
setvbuf(stdout, NULL, _IONBF, 0);
printf("Please input the value of N: \n");
scanf("%d", &N );
for (int i = 1; i <= N; i ) {
for (int j = i 1; j <= N; j ) {
// The innermost loop checks for the triangle
// property
for (int k = j 1; k <= N; k ) {
// Sum of two sides is greater than the
// third
if (i j > k && i k > j && k j > i)
{
count ;
}
}
}
}
printf ("Total number of triangles possible is %d ",count);
return 0;
}
uj5u.com熱心網友回復:
找出額外的代碼行,它強制執行 3 個數字是“不同的”(閱讀“唯一”)的約束。有趣的是,有點“列印除錯”會出現什么......
printf("Please input the value of N: ");
scanf("%d", &N );
for (int i = 1; i < N; i ) {
for (int j = 1; j < N; j ) {
for (int k = 1; k < N; k ) {
if (i j > k && i k > j && k j > i) {
if( i != j && j != k && k != i ) {
printf( "%d %d %d\n", i, j, k );
count ;
}
}
}
}
}
printf ("Total number of triangles possible is %d ",count);
輸出
Please input the value of N: 5
2 3 4
2 4 3
3 2 4
3 4 2
4 2 3
4 3 2
Total number of triangles possible is 6
OP 代碼計數 (1,1,1) 或 (2,3,3) 違反“不同”數字。
并且,OP 人員現在對于例如 (4,2,3) 和 (4,3,2) 是否不同存在歧義。
printf()- 當事情沒有意義時,程式員的朋友......
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507325.html
標籤:C
上一篇:如果整數的大小在C中是4,??那么為什么它告訴我它小于-1?[復制]
下一篇:c中的switch陳述句數字范圍
