#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
。我无法弄清楚如何防止这种情况的发生。我如何打印这些组合?感谢您的任何帮助。
答案 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;
}
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