gcc C语言:无法正常工作的三重嵌套while()循环

polhcujo  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(185)

我想用C语言写一个代码,只使用嵌套的while ()循环,输出一个在正整数范围内与勾股三元组匹配的三元组列表(a2 = b2 + c2,a,b和c ∈ +)。
我写的是这样的:

//Programme to output possible Pythagorean triples in a range of unsigned integers.

#include <stdio.h>

int main(void) {

    unsigned int i = 1, j = 1, ij = 1;

    puts("\n***To calculate Pythag. triple integers...***\n");
    while (i <= 250) {
        while (j <= 250) {
            while (ij <= 250) {
                if (ij * ij == i * i + j * j) {
                    printf ("Candidate triple: (%u, %u, %u)\n", ij, i, j);
                }
                ++ij;
            }
            ++j;
        }
        ++i;
    }
    return 0;
}

它不起作用。它只显示第一个puts()函数中的文本。
输出:

我犯了什么错?

7lrncoxx

7lrncoxx1#

在i=1,j=1,ij=251的循环结束后,你永远不会再进入最内层的循环,因为你永远不会把ij设置回1j也是如此。
已修复:

unsigned i = 1;
    while (i <= 250){
        unsigned j = 1;
        while (j <= 250){
            unsigned ij = 1;
            while (ij <= 250){
                if (ij*ij == i*i + j*j) {
                    printf("Candidate triple: (%u, %u, %u)\n", ij, i, j);
                }
                ++ij;
            }
            ++j;
        }
        ++i;
    }

我们通常这样写:

for ( unsigned i = 1; i <= 250; ++i ) {
        for ( unsigned j = 1; j <= 250; ++j ) {
            for ( unsigned ij = 1; ij <= 250; ++ij ) {
                if (ij*ij == i*i + j*j) {
                    printf("Candidate triple: (%u, %u, %u)\n", ij, i, j);
                }
            }
        }
    }

这仍然是一个while循环,但使用了for关键字/语法。
请注意,预先计算250个正方形 * 可能 * 会更快。我们也可以减少加法的次数。一旦找到匹配项,我们就可以跳出内部循环。

unsigned squares[251]; // 0..250
    for ( unsigned i = 1; i <= 250; ++i ) {
        squares[i] = i*i;
    }

    for ( unsigned i = 1; i <= 250; ++i ) {
        unsigned ii = squares[i];
        for ( unsigned j = 1; j <= 250; ++j ) {
            unsigned jj = squares[j];
            unsigned iipjj = ii+jj;
            for ( unsigned k = 1; k <= 250; ++k ) {
                unsigned kk = squares[k];
                if (kk == iipjj) {
                    printf("Candidate triple: (%u, %u, %u)\n", k, i, j);
                    break;
                }
            }
        }
    }
kognpnkq

kognpnkq2#

内部循环退出后,其变量不会重新初始化,仍为251。您应在外循环内部初始化变量:

while (i <= 250){
        j = 1;
        while (j <= 250){
            ij = 1;
            while (ij <= 250){
                if (ij*ij == i*i + j*j){
                    printf ("Candidate triple: (%u, %u, %u)\n", ij, i, j);
                }
                ++ij;
            }
            ++j;
        }
        ++i;
    }

相关问题