今天看到一个简单枚举的题目
除法
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79. 样例输入: 62 样例输出: 79546/01238=62 94736/01528=62
我是这么搞的
#include <stdio.h> #include <stdlib.h> #include <string.h> int n; void enumerate(char dividend[], int div_index) { if (div_index == 5) { int divide = atoi(dividend); int product = divide * n; if (product > 10000 && product <99999) { char product_str[6]; sprintf(product_str, "%d", product); int map[10] = {0}; int conflict = 0; for (int i=0; i<5; i++) { if (map[product_str[i]-'0'] == 0) { map[product_str[i]-'0']++; } else { conflict = 1; break; } } for (int i=0; i<5; i++) { if (map[dividend[i]-'0'] == 0) { map[dividend[i]-'0']++; } else { conflict = 1; break; } } if ( ! conflict) { printf("%s / %s = %dn", product_str, dividend, n); } } return; } for (char ch='0'; ch<='9'; ch++) { int occupy = 0; for (int i=0; i<div_index; i++) { if (dividend[i] == ch) { occupy = 1; break; } } if ( ! occupy) { dividend[div_index] = ch; enumerate(dividend, div_index+1); } } } int main() { while (scanf("%d", &n) == 1) { char dividend[6] = {0}; enumerate(dividend, 0); } return 0; }
输入输出
62 79546 / 01283 = 62 94736 / 01528 = 62 7 16758 / 02394 = 7 18459 / 02637 = 7 31689 / 04527 = 7 36918 / 05274 = 7 37926 / 05418 = 7 41832 / 05976 = 7 53298 / 07614 = 7 98532 / 14076 = 7
不过这明显太长了,继续写短。。
参考这里,http://blog.csdn.net/xujinsmil…,得到如下代码
#include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { for (int i=1234; i<=98765; i++) { if (n*i <= 98765) { int map[10] = {0}; int ii=i, ni=n*i; for (int j=0; j<5; j++, ii/=10, ni/=10) { map[ii%10]++; map[ni%10]++; } for (int j=0; j<10; j++) { if (map[j] != 1) { break; } if (j == 9) { if (i < 10000) { printf("%d / 0%d = %dn", n*i, i, n); } else { printf("%d / %d = %dn", n*i, i, n); } } } } } } return 0; }
输入输出
62 79546 / 01283 = 62 94736 / 01528 = 62 7 16758 / 02394 = 7 18459 / 02637 = 7 31689 / 04527 = 7 36918 / 05274 = 7 37926 / 05418 = 7 41832 / 05976 = 7 53298 / 07614 = 7 98532 / 14076 = 7