程序打印所有平方等于给定数字的数字组合

时间:2018-10-21 16:09:18

标签: c

#include <stdio.h>

void printCombs(int n) {
    int i, j, limit = ceil(sqrt(n));
    for(i = 1; i < limit; i++) {
        for(j = i; j < limit; j++) {
            if(i*i + j*j == n) {
                printf("%d,%d\n", i, j);
                printf("%d,", j);
                printCombs(i*i);
                printf("\n%d,", i);
                printCombs(j*j);    
                printf("\n");
            }
        }
    }
}

int main() {

    int n;
    scanf("%d", &n);

    printCombs(n);

    return 0;
}

我已经编写了此代码,该代码输出平方和等于给定输入的数字组合。代码工作正常,但问题出在不需要的输出上。

例如,我输入1000:

1000
10,30
30,6,8
8,
6,

10,18,24
24,
18,

18,26
26,
18,10,24
24,6,8
8,
6,

10,

首先我得到10,30很好,因为100 + 900 = 1000。

那么30,6,8 => 900 + 36 + 64 = 1000。

那么10,18,24 => 100 + 324 + 576 = 1000。

然后18、26 => 324 + 676 = 1000。

然后18、10、24 => 576 + 100 + 324 = 1000。

现在这些都是组合。但是您可以看到,由于递归调用之前的printf(),屏幕上还输出了一些其他数字,但没有输出任何数字。最后输出24, 6, 8。我无法弄清楚如何防止这种情况的发生。我如何打印这些组合?感谢您的任何帮助。

1 个答案:

答案 0 :(得分:1)

而不是一点一点地打印,而是尝试在一个语句中打印所有数字。

为此,您可能需要稍微重写一下函数。

这是我的尝试

#include <math.h>
#include <stdio.h>

void printCombs2(int n, int k) {
    int limit = ceil(sqrt(n));
    for (int i = 1; i < limit; i++) {
        for (int j = i; j < limit; j++) {
            if (i*i + j*j == n) {
//                printf("%d, %d, %d\n", i, j, k);
                printf("%d, %d, %d ==> %d+%d+%d=%d\n", i, j, k, i*i, j*j, k*k, i*i+j*j+k*k);
            }
        }
    }
}

void printCombs(int n) {
    printf("combs(%d):\n", n);
    int limit = ceil(sqrt(n));
    for (int i = 1; i < limit; i++) {
        for (int j = i; j < limit; j++) {
            if (i*i + j*j == n) {
//                printf("%d, %d\n", i, j);
                printf("%d, %d ==> %d+%d=%d\n", i, j, i*i, j*j, i*i+j*j);
                printCombs2(i*i, j);
                printCombs2(j*j, i);
            }
        }
    }
    puts("");
}

int main(void) {
    printCombs(100);
    printCombs(1000);
    printCombs(10000);

    return 0;
}

查看running on ideone.com

combs(100):
6, 8 ==> 36+64=100

combs(1000):
10, 30 ==> 100+900=1000
6, 8, 30 ==> 36+64+900=1000
18, 24, 10 ==> 324+576+100=1000
18, 26 ==> 324+676=1000
10, 24, 18 ==> 100+576+324=1000

combs(10000):
28, 96 ==> 784+9216=10000
60, 80 ==> 3600+6400=10000
36, 48, 80 ==> 1296+2304+6400=10000
48, 64, 60 ==> 2304+4096+3600=10000