u725子集生成
2017-02-19 01:11
92 查看
一开始用全排列做了,然后超时,然后看了网上的,取巧的感觉,不太明白子集生成什么情况
自己的:
//
// main.cpp
// u725
//
// Created by Mr.Xue on 17/2/18.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace
std;
int a[12],iend,b[12],n,fl;
int jisuan()
{
int m=b[6],c=b[1],d=1;
for(int i=2;i<6;i++)
{
d=d*10;
m=m+b[i+5]*d;
c=c+b[i]*d;
}
if(n>60000)
{
fl=1;
return
0;
}
if(n*c==m)
{
printf("%d%d%d%d%d / %d%d%d%d%d = %d\n",b[10],b[9],b[8],b[7],b[6],b[5],b[4],b[3],b[2],b[1],n);
return
1;
}
else
return
0;
}
void quanpailie_DFS(int j)
{
if(fl==1)
return;
if(j>10)
{
if(jisuan()==1)
iend=1;
return;
}
for(int i=0;i<10;i++)
{
if(a[i]==0)
{
b[j]=i;
a[i]=1;
quanpailie_DFS(j+1);
a[i]=0;
}
}
}
int main()
{
while(scanf("%d",&n)&&n!=0)
{
memset(a,0,sizeof(a));
iend=0;
fl=0;
quanpailie_DFS(1);
if(iend==0)
printf("no soluation\n");
cout <<
"\n";
}
return
0;
}
网上的
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace
std;
int used[10];
int judge( int a,
int b )
{
if ( b >
98765 )
return
0;
for (
int i = 0 ; i <
10 ; ++ i )
used[i] =
0;
if ( a <
10000 )
used[0] =
1;
while ( a )
{
used[a%10] =
1;
a /= 10;
}
while ( b )
{
used[b%10] =
1;
b /= 10;
}
int sum =
0;
for (
int i = 0 ; i <
10 ; ++ i )
sum += used[i];
return (sum ==
10);
}
int main()
{
int n, T =
0;
while (
~scanf("%d",&n) && n ) {
if ( T ++ )
printf("\n");
int count =
0;
for (
int i = 1234 ; i <
100000 ; ++ i ) {
if (
judge( i, i*n ) ) {
printf("%05d / %05d = %d\n",i*n,i,n);
count ++;
}
}
if ( !count )
printf("There are no solutions for %d.\n",n);
}
return
0;
}
自己的:
//
// main.cpp
// u725
//
// Created by Mr.Xue on 17/2/18.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace
std;
int a[12],iend,b[12],n,fl;
int jisuan()
{
int m=b[6],c=b[1],d=1;
for(int i=2;i<6;i++)
{
d=d*10;
m=m+b[i+5]*d;
c=c+b[i]*d;
}
if(n>60000)
{
fl=1;
return
0;
}
if(n*c==m)
{
printf("%d%d%d%d%d / %d%d%d%d%d = %d\n",b[10],b[9],b[8],b[7],b[6],b[5],b[4],b[3],b[2],b[1],n);
return
1;
}
else
return
0;
}
void quanpailie_DFS(int j)
{
if(fl==1)
return;
if(j>10)
{
if(jisuan()==1)
iend=1;
return;
}
for(int i=0;i<10;i++)
{
if(a[i]==0)
{
b[j]=i;
a[i]=1;
quanpailie_DFS(j+1);
a[i]=0;
}
}
}
int main()
{
while(scanf("%d",&n)&&n!=0)
{
memset(a,0,sizeof(a));
iend=0;
fl=0;
quanpailie_DFS(1);
if(iend==0)
printf("no soluation\n");
cout <<
"\n";
}
return
0;
}
网上的
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace
std;
int used[10];
int judge( int a,
int b )
{
if ( b >
98765 )
return
0;
for (
int i = 0 ; i <
10 ; ++ i )
used[i] =
0;
if ( a <
10000 )
used[0] =
1;
while ( a )
{
used[a%10] =
1;
a /= 10;
}
while ( b )
{
used[b%10] =
1;
b /= 10;
}
int sum =
0;
for (
int i = 0 ; i <
10 ; ++ i )
sum += used[i];
return (sum ==
10);
}
int main()
{
int n, T =
0;
while (
~scanf("%d",&n) && n ) {
if ( T ++ )
printf("\n");
int count =
0;
for (
int i = 1234 ; i <
100000 ; ++ i ) {
if (
judge( i, i*n ) ) {
printf("%05d / %05d = %d\n",i*n,i,n);
count ++;
}
}
if ( !count )
printf("There are no solutions for %d.\n",n);
}
return
0;
}