问题
https://vjudge.net/problem/UVA-10396
分析
找到v=x*y
要求:
v分别是4位,6位,8位
v是偶数
x,y不能同时0为结尾
x,y的两个数字混合在一起,可以得到v
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
const int maxn=100000+5;
int n,Left[]={10,100,1000},Right[]={100,1000,10000},lim[]={1000,100000,10000000};
set<int> ans[3];
inline bool check(int v,int x,int y,int num){
int d[10],k=(num<<1);
for(int i=0;i<10;++i) d[i]=0;
for(int i=0;i<num;++i){
++d[x%10];
++d[y%10];
x/=10;
y/=10;
}
for(int i=0;i<k;++i){
--d[v%10];
v/=10;
}
for(int i=0;i<10;++i){
if(d[i]!=0) return false;
}
return true;
}
void solve(){
for(int i=0;i<3;++i){
int down=Left[i],up=Right[i],l=lim[i];
for(int x=down;x<up;++x){
for(int y=x;y<up;++y){
if((x&1) && (y&1)) continue;
if(x%10==0 && y%10==0) continue;
int v=x*y;
if(v<l) continue;
if(check(v,x,y,2+i)) ans[i].insert(v);
}
}
}
}
int main(void){
solve();
while(scanf("%d",&n)==1) {
int t=0;
if(n==4) t=0;
else if(n==6) t=1;
else t=2;
for(auto iter=ans[t].begin();iter!=ans[t].end();++iter) {
printf("%d\n",*iter);
}
printf("\n");
}
return 0;
}