user-0 提问: 三个三位数相加的枚举法问题

回复:
user: user-1
content: 引用 8 楼 liu6tot 的回复:究竟该怎样统计满足条件的等式数目呢？ if((a[0] * 100 + a[1] * 10 + a[2] + a[3] * 100 + a[4] * 10 + a[5]) == (a[6] * 100 + a[7] * 10 + a[8]) && a[0] != 0 && a[3] != 0 && (a[0] * 100 + a[1] * 10 + a[2] <= 500)) { count ++; } 设置全局的count，在这个判断里，如果进入这个判断就将count++；

user: user-0
content: 究竟该怎样统计满足条件的等式数目呢？

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-0
content: 引用 5 楼 galiniur0u 的回复:思路： 1、楼主可以算10个数的全排列，这样可以去掉重复的数字的判断。 2、计算前9个数字，前三个数字+中间三个数字==后三个数字。 3、打印输出a[0] * 100 +a[1] * 10 + a[2] <= 500的情况。 #include <stdlib.h> #include <stdio.h>  void swap(int *a, int *b) { 	int tmp = *a; 	*a = *b; 	*b = tmp; }  int all(int m, int a[], int num) { 	int i = 0; 	if(m == 10) 	{ 		if((a[0] * 100 + a[1] * 10 + a[2] + a[3] * 100 + a[4] * 10 + a[5]) == (a[6] * 100 + a[7] * 10 + a[8]) && a[0] != 0 && a[3] != 0 && (a[0] * 100 + a[1] * 10 + a[2] <= 500)) 		{ 			printf("%8d : ", num); 			for(i = 0; i < 3; i ++) 			{ 				printf("%d ", a[i]); 			} 			printf("+ "); 			for(i = 3; i < 6; i ++) 			{ 				printf("%d ", a[i]); 			} 			printf("= "); 			for(i = 6; i < 9; i ++) 			{ 				printf("%d ", a[i]); 			} 			printf("\n"); 		} 		return ++ num; 	} 	for(i = m; i < 10; i ++) 	{ 		swap(&a[i], &a[m]); 		num = all(m + 1, a, num); 		swap(&a[i], &a[m]); 	} 	return num; }  int main() { 	int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 	all(0, a, 0); }  请问兄台 在递归条件下怎么统计满足条件的等式数目呢？

user: user-3
content: 这样或许会好一点： 先把所有不重复的三位数找出来，放到一个数组里 然后遍历这个数组，使里面任意两个数相加一次，判断是否满足

user: user-4
content: void fun(int *p,int c,short& wFlag,unsigned int& nCount) { 	for (int i = 0; i < 10; ++ i) 	{ 		short f = 1 << i; 		if ((wFlag & f) == 0) 		{ 			p[c] = i; 			if (c == 8) 			{ 				if (p[0]*100 + p[1]*10 + p[2] + p[3]*100 + p[4]*10 + p[5] == p[6]*100 + p[7]*10 + p[8]) 				{ 					++ nCount; 					printf("%d,%d,%d,%d,%d,%d,%d,%d,%d\n",p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8]); 				} 				return; 			} 			else 			{ 				wFlag |= f; 				fun(p,c+1,wFlag,nCount); 				wFlag &= (~f); 			} 		} 	} }  int main() { 	int p[9]; 	short wFalg = 0; 	unsigned int nCount = 0; 	for (int i = 0; i < 10; ++ i) 	{ 		p[0] = i; 		wFalg = 1; 		fun(p,1,wFalg,nCount); 	} 	return 0; }

user: user-5
content: 等号左边，最小的组合是（我目前能想到的）： 205+134 105+234 等号右边，最大的组合是： 987 没必要全部列举 或者搞一个排列组合

user: user-6
content: 为什么你的循环都是 1 到 9 ，而不是 0 到 9 ...

user: user-1
content: 思路： 1、楼主可以算10个数的全排列，这样可以去掉重复的数字的判断。 2、计算前9个数字，前三个数字+中间三个数字==后三个数字。 3、打印输出a[0] * 100 +a[1] * 10 + a[2] <= 500的情况。 #include <stdlib.h> #include <stdio.h>  void swap(int *a, int *b) { 	int tmp = *a; 	*a = *b; 	*b = tmp; }  int all(int m, int a[], int num) { 	int i = 0; 	if(m == 10) 	{ 		if((a[0] * 100 + a[1] * 10 + a[2] + a[3] * 100 + a[4] * 10 + a[5]) == (a[6] * 100 + a[7] * 10 + a[8]) && a[0] != 0 && a[3] != 0 && (a[0] * 100 + a[1] * 10 + a[2] <= 500)) 		{ 			printf("%8d : ", num); 			for(i = 0; i < 3; i ++) 			{ 				printf("%d ", a[i]); 			} 			printf("+ "); 			for(i = 3; i < 6; i ++) 			{ 				printf("%d ", a[i]); 			} 			printf("= "); 			for(i = 6; i < 9; i ++) 			{ 				printf("%d ", a[i]); 			} 			printf("\n"); 		} 		return ++ num; 	} 	for(i = m; i < 10; i ++) 	{ 		swap(&a[i], &a[m]); 		num = all(m + 1, a, num); 		swap(&a[i], &a[m]); 	} 	return num; }  int main() { 	int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 	all(0, a, 0); }