Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印其平方等于给定数字的所有数字组合的程序_C - Fatal编程技术网

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

C 打印其平方等于给定数字的所有数字组合的程序,c,C,首先我得到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时。我无法找出如何防止这种情况发生。如何打印这些组合?感谢您的帮助。与其一点一点地打印,

首先我得到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
时。我无法找出如何防止这种情况发生。如何打印这些组合?感谢您的帮助。

与其一点一点地打印,不如尝试在一个语句中打印所有数字

为此,您可能需要重写一点函数

这是我的尝试

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,
#包括
#包括
无效打印组合2(整数n,整数k){
int limit=ceil(sqrt(n));
对于(int i=1;i%d+%d+%d=%d\n”,i,j,k,i*i,j*j,k*k,i*i+j*j+k*k);
}
}
}
}
空打印梳(内部n){
printf(“梳(%d):\n”,n);
int limit=ceil(sqrt(n));
对于(int i=1;i%d+%d=%d\n”,i,j,i*i,j*j,i*i+j*j);
打印梳2(i*i,j);
打印梳2(j*j,i);
}
}
}
认沽权(“”);
}
内部主(空){
打印梳(100);
打印梳(1000);
打印梳(10000);
返回0;
}
看到了吗

梳子(100个): 6, 8 ==> 36+64=100 梳子(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 梳子(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向函数传递“prefix”似乎更简单。(要摆脱
printf(“%d,”,j);
,您需要
sprintf
)@Jarod42我不明白?但你的算法可能会错过一些组合:
3=1²+1²+1²
,但不能写成
a²+b²
。@Jarod42我知道这不是问题所在,但前提是你能指导我用更一般的方法解决这个问题?我的意思是,我知道这可以通过应用嵌套循环来实现,这样每个组合都可以被检查,但我如何将其转换为递归?我的意思是类似于Jarod的解决方案不是更简洁吗?你可能更喜欢它。它找到的答案(有4个数字的答案)比你的解决方案多(所以其实不一样)。我发现我的版本更容易理解,因为没有前缀可以跟踪。如果您需要递归解决方案,那么是的,Jarod的解决方案肯定更好。
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,
#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;
}
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