题目链接https://ac.nowcoder.com/acm/problem/18929
基础题
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1e4;
#define ref(i,a,b) for(int i=(a); i<=(b); ++i)
#define rep(i,a,b) for(int i=(a); i>=(b); --i)
#define ret(i,a,b) for(int i=(a); i<(b); ++i)
int vis[10];
inline void fun(int n)
{
while(n)
{
vis[n%10]++;
n /= 10;
}
}
int main()
{
ref(n,1000,9000) // 乘积必定是四位数
{
int num= sqrt(n); //防止重复计算
ref(i,1,num)
{
int j = n / i;
if(i * j != n) continue; //防止因为除法向下取整带来的错误
memset(vis,0,sizeof(vis));
fun(n); fun(i); fun(j);
int flag = 0;
ref(p,1,9) if(vis[p] == 1) flag++;
if(flag == 9) cout << n << " = " << i << " x " << j << endl;
}
}
return 0;
}
解题关键点
1,确定乘积的取值范围,必须是一个四位数
2,因为是枚举乘积,所以答案就是按照乘积升序排列
3,枚举1 - sqrt(n),n / i 得到另一个乘数 j 并且排除了重复
4,排除向下取整带来的错误
5,映射到vis数组下标,确保数字1 - 9都出现