今天看到一个简单枚举的题目
除法
输入正整数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