AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[10];
bool check(int f,int r)
{
memset(a,0,sizeof(a));
if(r > 99999)
return false;
for(int i = 0; i < 5; i++)
{
a[f % 10]++;
a[r % 10]++;
f /= 10;
r /= 10;
}
for(int i = 0; i < 10; i++)
if(a[i] != 1)
return false;
return true;
}
int main()
{
int n,kase = 0;
while(scanf("%d",&n) == 1 && n)
{
if(kase++ > 0) printf("\n");
bool flag = false;
for(int i = 1234; i < 98766; i++)
{
if(check(i,n * i))
{
printf("%05d / %05d = %d\n",n*i,i,n);
flag = true;
}
}
if(flag == false)
{
printf("There are no solutions for %d.\n",n);
}
}
return 0;
}
以上代码需要40ms左右才能跑完测试数据,实际上只要我们将枚举范围缩小,合理利用break、continue,可以显著减少枚举量,0ms左右就能跑完测试数据,代码如下:
#include<bits/stdc++.h>
using namespace std;
int book[10];
int main()
{
int n;
int line = 1;
while (cin >> n && n)
{
if (line) line = 0;
else printf("\n");
int num1, num2;
int flag = 0;
for (num2 = 1234; num2 <= 49876; num2++)
{
memset(book, 0, sizeof(book));
num1 = num2 * n;
if (num1 < 1e+4)
continue;
if (num1 >= 1e+5)
break;
int num2_copy = num2, num1_copy = num1;
int ok = 1;
for (int i = 0; i < 5; i++)
{
book[num1_copy % 10]++;
book[num2_copy % 10]++;
if (book[num1_copy % 10] > 1 || book[num2_copy % 10] > 1)
{
ok = 0;
break;
}
num1_copy /= 10;
num2_copy /= 10;
}
if (ok == 0)
continue;
flag = 1;
printf("%05d / %05d = %d\n", num1, num2 ,n);
}
if (flag == 0) printf("There are no solutions for %d.\n", n);
}
return 0;
}