user-0 提问: 求【C语言如何通过用户输入的内容进行筛选】

回复:
user: user-0
content: 引用 5 楼 赵4老师的回复:没实际编译链接调试，不保证对，仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() {     int n,m,z=0;     int a,b,c,d,e,f,g,h,i,r;     int *t=NULL;     int v[10];     printf("输入数组v的10个数\n");     for (m=0;m<10;m++) {         scanf("%d",&v[m]);     }     printf("输入一个数\n");     scanf("%d",&a);     printf("输入差值\n");     scanf("%d",&h);     for(b=1;b<h;b++) {         for(c=1;c<h;c++) {             for(d=1;d<h;d++) {                 if (b+c+d==h) {                     e=a+b;                     f=e+c;                     g=f+d;                     t=(int *)realloc(t,(z+1)*4*sizeof(int));                     if (t) {                         t[z*4+0]=a;                         t[z*4+1]=e;                         t[z*4+2]=f;                         t[z*4+3]=g;                         //printf("%d+%d+%d=%d\n",b,c,d,h);                         printf("%2d %2d %2d %2d\n",t[z*4+0],t[z*4+0],t[z*4+0],t[z*4+0]);                         z++;                     } else {                         printf("Can not realloc %d bytes!\n",(z+1)*4*sizeof(int));                         return 1;                     }                 }             }         }     }     printf("共有%d种方式\n",z);     printf("筛选后结果为：");     r=0;     for (i=0;i<z;i++) {         for (m=0;m<10;m++) {             if (t[i*4+0]==v[m]) break;         }         if (m<10) {             for (m=0;m<10;m++) {                 if (t[i*4+1]==v[m]) break;             }             if (m<10) {                 for (m=0;m<10;m++) {                     if (t[i*4+2]==v[m]) break;                 }                 if (m<10) {                     for (m=0;m<10;m++) {                         if (t[i*4+3]==v[m]) break;                     }                     if (m<10) {                         r++;                         printf("%2d %2d %2d %2d包含在数组v内\n",t[i*4+0],t[i*4+0],t[i*4+0],t[i*4+0]);                     }                 }             }         }     }     if (r==0) printf("你输出的结果没有包含在数组v内\n");     free(t);     return 0; }  那么要是我想再输出两个数像这样： 输出6个数的排列引用3楼的方法应该怎么改？

user: user-0
content: 引用 5 楼 赵4老师的回复:没实际编译链接调试，不保证对，仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() {     int n,m,z=0;     int a,b,c,d,e,f,g,h,i,r;     int *t=NULL;     int v[10];     printf("输入数组v的10个数\n");     for (m=0;m<10;m++) {         scanf("%d",&v[m]);     }     printf("输入一个数\n");     scanf("%d",&a);     printf("输入差值\n");     scanf("%d",&h);     for(b=1;b<h;b++) {         for(c=1;c<h;c++) {             for(d=1;d<h;d++) {                 if (b+c+d==h) {                     e=a+b;                     f=e+c;                     g=f+d;                     t=(int *)realloc(t,(z+1)*4*sizeof(int));                     if (t) {                         t[z*4+0]=a;                         t[z*4+1]=e;                         t[z*4+2]=f;                         t[z*4+3]=g;                         //printf("%d+%d+%d=%d\n",b,c,d,h);                         printf("%2d %2d %2d %2d\n",t[z*4+0],t[z*4+0],t[z*4+0],t[z*4+0]);                         z++;                     } else {                         printf("Can not realloc %d bytes!\n",(z+1)*4*sizeof(int));                         return 1;                     }                 }             }         }     }     printf("共有%d种方式\n",z);     printf("筛选后结果为：");     r=0;     for (i=0;i<z;i++) {         for (m=0;m<10;m++) {             if (t[i*4+0]==v[m]) break;         }         if (m<10) {             for (m=0;m<10;m++) {                 if (t[i*4+1]==v[m]) break;             }             if (m<10) {                 for (m=0;m<10;m++) {                     if (t[i*4+2]==v[m]) break;                 }                 if (m<10) {                     for (m=0;m<10;m++) {                         if (t[i*4+3]==v[m]) break;                     }                     if (m<10) {                         r++;                         printf("%2d %2d %2d %2d包含在数组v内\n",t[i*4+0],t[i*4+0],t[i*4+0],t[i*4+0]);                     }                 }             }         }     }     if (r==0) printf("你输出的结果没有包含在数组v内\n");     free(t);     return 0; }  大神你好我想过了要实现这个想法必须要把要判断输入规则生成的那些数字中 有没有一行是包含在v数组中。 只要首先将v数组排序。 然后假设输入的数字是A  差值是 B 那么就只要判断 A和 A+B 在不在v数组中，并且，v数组中A所在位置和A+B所在位置之间有至少2个数，这样就可以保证有一行包含在v数组中了。  判断 v数组中A所在位置和A+B所在位置之间有至少2个数  通过下标就可以判断了 所以只能用2楼的那种方法比较合适

user: user-1
content: 没实际编译链接调试，不保证对，仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() {     int n,m,z=0;     int a,b,c,d,e,f,g,h,i,r;     int *t=NULL;     int v[10];     printf("输入数组v的10个数\n");     for (m=0;m<10;m++) {         scanf("%d",&v[m]);     }     printf("输入一个数\n");     scanf("%d",&a);     printf("输入差值\n");     scanf("%d",&h);     for(b=1;b<h;b++) {         for(c=1;c<h;c++) {             for(d=1;d<h;d++) {                 if (b+c+d==h) {                     e=a+b;                     f=e+c;                     g=f+d;                     t=(int *)realloc(t,(z+1)*4*sizeof(int));                     if (t) {                         t[z*4+0]=a;                         t[z*4+1]=e;                         t[z*4+2]=f;                         t[z*4+3]=g;                         //printf("%d+%d+%d=%d\n",b,c,d,h);                         printf("%2d %2d %2d %2d\n",t[z*4+0],t[z*4+0],t[z*4+0],t[z*4+0]);                         z++;                     } else {                         printf("Can not realloc %d bytes!\n",(z+1)*4*sizeof(int));                         return 1;                     }                 }             }         }     }     printf("共有%d种方式\n",z);     printf("筛选后结果为：");     r=0;     for (i=0;i<z;i++) {         for (m=0;m<10;m++) {             if (t[i*4+0]==v[m]) break;         }         if (m<10) {             for (m=0;m<10;m++) {                 if (t[i*4+1]==v[m]) break;             }             if (m<10) {                 for (m=0;m<10;m++) {                     if (t[i*4+2]==v[m]) break;                 }                 if (m<10) {                     for (m=0;m<10;m++) {                         if (t[i*4+3]==v[m]) break;                     }                     if (m<10) {                         r++;                         printf("%2d %2d %2d %2d包含在数组v内\n",t[i*4+0],t[i*4+0],t[i*4+0],t[i*4+0]);                     }                 }             }         }     }     if (r==0) printf("你输出的结果没有包含在数组v内\n");     free(t);     return 0; }

user: user-0
content: 谢谢大神！我所说的就是这个意思组合是固定长度的我也知道把10种发式的结果用另外的数组储存但是我写的代码有四个数组啊 不懂的用什么方法去实现。。。你发的含有指针函数我还没学到看的不太懂能不能做个纯c的呢？

user: user-2
content: 把输出10种方式的结果用另外的数组把其储存起来，然后再用数组v里的10元素进行判断，最后把筛选结果显示出来？ —— 如果组合是固定长度，可以用数组，数组个数如果不确定就用指针每次malloc固定长度，数组长度如果不确定就malloc可变长度。这肯定可以实现啊？有什么疑问？

user: user-3
content: 有乱码。。。  #include <stdio.h> #include <stdlib.h>  void get_input(int* arr, int* num, int* val); int binary_search(int array[], int low, int high, int target); void print_result(int* arr, int idx1, int idx2);  int main(void) { 	int i = 0; //for loop 	int arr[10]; 	int number; //选择数  	int value;	//差值 	 	int idx1, idx2; 	 	//get input 	get_input(arr, &number, &value); 		 	//get index 	idx1 = binary_search(arr, 0, 9, number); 	if (-1 == idx1) 	{ 		printf("输入的数不再数组中\n"); 		return -1; 	} 	 	idx2 = binary_search(arr, 0, 9, number + value); 	if (-1 == idx2) 	{ 		printf("输入的差值不符合要求\n"); 		return -1; 	} 	 	print_result(arr, idx1, idx2); 	  	return 0; }  int arr_comp(const void* d1, const void* d2) { 	return *(int*)d1 - *(int*)d2; }  void get_input(int* arr, int* num, int* val) { 	int i = 0; //for loop 	 	//get array 	printf("输入数组v的10个数\n"); 	for (i = 0; i < 10; i++) 	{ 		scanf("%d", arr + i); 	} 	 	//快速排序  	qsort(arr, 10, sizeof(int), arr_comp); 	 	//get number   	printf("输入一个数\n");     scanf("%d", num);      //get value     printf("输入差值\n");     scanf("%d", val); }  //二分查找  int binary_search(int array[], int low, int high, int target) { 	int mid = 0; 	  	while(low <= high) 	{ 		mid = (low + high) / 2; 		if (array[mid] > target) 		{ 			high=mid-1; 		}	 		else if (array[mid] < target) 		{ 			low=mid+1; 		} 		else//findthetarget 		{ 			return mid; 		} 	}  	return-1; }  void print_result(int* arr, int idx1, int idx2) { 	int i, j;  	int count = 0; 	 	if ((idx2 - idx1) < 3) 	{ 		printf("共有0种方式\n"); 		return; 	} 	 	for (i = idx1 + 1; i < idx2 - 1; i++) 	{ 		for (j = i + 1; j < idx2; j++) 		{ 			count++; 			printf("%2d %2d %2d %2d\n", arr[idx1], arr[i], arr[j], arr[idx2]); 		} 	} 	 		printf("共有%d种方式\n", count); }

user: user-3
content: 没看懂LZ到底想要什么样的  #include <stdio.h> #include <stdlib.h>  void get_input(int* arr, int* num, int* val); int binary_search(int array[], int low, int high, int target); void print_result(int* arr, int idx1, int idx2);  int main(void) { 	int i = 0; //for loop 	int arr[10]; 	int number; //Ñ¡ÔñÊý  	int value;	//²îÖµ 	 	int idx1, idx2; 	 	//get input 	get_input(arr, &number, &value); 		 	//get index 	idx1 = binary_search(arr, 0, 9, number); 	if (-1 == idx1) 	{ 		printf("ÊäÈëµÄÊý²»ÔÙÊý×éÖÐ\n"); 		return -1; 	} 	 	idx2 = binary_search(arr, 0, 9, number + value); 	if (-1 == idx2) 	{ 		printf("ÊäÈëµÄ²îÖµ²»·ûºÏÒªÇó\n"); 		return -1; 	} 	 	print_result(arr, idx1, idx2); 	  	return 0; }  int arr_comp(const void* d1, const void* d2) { 	return *(int*)d1 - *(int*)d2; }  void get_input(int* arr, int* num, int* val) { 	int i = 0; //for loop 	 	//get array 	printf("ÊäÈëÊý×évµÄ10¸öÊý\n"); 	for (i = 0; i < 10; i++) 	{ 		scanf("%d", arr + i); 	} 	 	//¿ìËÙÅÅÐò  	qsort(arr, 10, sizeof(int), arr_comp); 	 	//get number   	printf("ÊäÈëÒ»¸öÊý\n");     scanf("%d", num);      //get value     printf("ÊäÈë²îÖµ\n");     scanf("%d", val); }  //¶þ·Ö²éÕÒ  int binary_search(int array[], int low, int high, int target) { 	int mid = 0; 	  	while(low <= high) 	{ 		mid = (low + high) / 2; 		if (array[mid] > target) 		{ 			high=mid-1; 		}	 		else if (array[mid] < target) 		{ 			low=mid+1; 		} 		else//findthetarget 		{ 			return mid; 		} 	}  	return-1; }  void print_result(int* arr, int idx1, int idx2) { 	int i, j;  	int count = 0; 	 	if ((idx2 - idx1) < 3) 	{ 		printf("¹²ÓÐ0ÖÖ·½Ê½\n"); 		return; 	} 	 	for (i = idx1 + 1; i < idx2 - 1; i++) 	{ 		for (j = i + 1; j < idx2; j++) 		{ 			count++; 			printf("%2d %2d %2d %2d\n", arr[idx1], arr[i], arr[j], arr[idx2]); 		} 	} 	 		printf("¹²ÓÐ%dÖÖ·½Ê½\n", count); }