98 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #define N 20
 | |
| 
 | |
| int nb_num;
 | |
| int tab[N];
 | |
| int stack_ptr;
 | |
| int stack_op[N];
 | |
| int stack_res[60];
 | |
| int result;
 | |
| 
 | |
| int find(int n, int i1, int a, int b, int op)
 | |
| {
 | |
|     int i, j;
 | |
|     int c;
 | |
| 
 | |
|     if (stack_ptr >= 0) {
 | |
|         stack_res[3*stack_ptr] = a;
 | |
|         stack_op[stack_ptr] = op;
 | |
|         stack_res[3*stack_ptr+1] = b;
 | |
|         stack_res[3*stack_ptr+2] = n;
 | |
|         if (n == result)
 | |
|             return 1;
 | |
|         tab[i1] = n;
 | |
|     }
 | |
| 
 | |
|     for(i=0;i<nb_num;i++) {
 | |
|         for(j=i+1;j<nb_num;j++) {
 | |
|             a = tab[i];
 | |
|             b = tab[j];
 | |
|             if (a != 0 && b != 0) {
 | |
| 
 | |
|                 tab[j] = 0;
 | |
|                 stack_ptr++;
 | |
| 
 | |
|                 if (find(a + b, i, a, b, '+'))
 | |
|                     return 1;
 | |
|                 if (find(a - b, i, a, b, '-'))
 | |
|                     return 1;
 | |
|                 if (find(b - a, i, b, a, '-'))
 | |
|                     return 1;
 | |
|                 if (find(a * b, i, a, b, '*'))
 | |
|                     return 1;
 | |
|                 if (b != 0) {
 | |
|                     c = a / b;
 | |
|                     if (find(c, i, a, b, '/'))
 | |
|                         return 1;
 | |
|                 }
 | |
| 
 | |
|                 if (a != 0) {
 | |
|                     c = b / a;
 | |
|                     if (find(c, i, b, a, '/'))
 | |
|                         return 1;
 | |
|                 }
 | |
| 
 | |
|                 stack_ptr--;
 | |
|                 tab[i] = a;
 | |
|                 tab[j] = b;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|     int i, res, p;
 | |
| 
 | |
|     if (argc < 3) {
 | |
|         printf("usage: %s: result numbers...\n"
 | |
|                "Try to find result from numbers with the 4 basic operations.\n", argv[0]);
 | |
|         exit(1);
 | |
|     }
 | |
| 
 | |
|     p = 1;
 | |
|     result = atoi(argv[p]);
 | |
|     printf("result=%d\n", result);
 | |
|     nb_num = 0;
 | |
|     for(i=p+1;i<argc;i++) {
 | |
|         tab[nb_num++] = atoi(argv[i]);
 | |
|     }
 | |
| 
 | |
|     stack_ptr = -1;
 | |
|     res = find(0, 0, 0, 0, ' ');
 | |
|     if (res) {
 | |
|         for(i=0;i<=stack_ptr;i++) {
 | |
|             printf("%d %c %d = %d\n",
 | |
|                    stack_res[3*i], stack_op[i],
 | |
|                    stack_res[3*i+1], stack_res[3*i+2]);
 | |
|         }
 | |
|         return 0;
 | |
|     } else {
 | |
|         printf("Impossible\n");
 | |
|         return 1;
 | |
|     }
 | |
| }
 |