#include <iostream>
#include <cmath>
using namespace std;
bool y_s(int a,int b,int c);
int main()//先遍历i,j.找到i,j,k,使得i = j*k,再利用y_s判断i = j*k这个式子中1~9每个数字是否正好出现一次,若是,则输出
{
int i,j,k = 0;
for (i = 1234;i < 9877;i++)//i最小为1234,最大为9876,缩小遍历范围
{
for (j = 2;j < sqrt(i);j++)//较小的因数j最小为2,最大也小于sqrt(i)
{
if (i % j == 0)//若j为i的因数 求出另外一个因数k
{
k = i / j;
if (y_s(i,k,j) == true)//判断i = j*k这个式子中1~9每个数字是否正好出现一次,若是,则输出
{
cout << i << " = " << j << " x " << k << endl;
}
}
}
}
}
bool y_s(int i,int j ,int k)//判断i = j*k这个式子中1~9每个数字是否正好出现一次
{
int counter [10] = {0};//用于存储式子中三个数1~9各个数字的出现次数 counter[1]即存储1的出现次数
while(i > 0)
{
counter[i % 10]++;//从最后一位位开始读取数字,使该数字的出现次数+1
i /= 10;//舍弃读取的位上的数字
}//当i的每位数都被存入counter后 i=0 循环中止
while(j > 0)//同上
{
counter[j % 10]++;
j /= 10;
}
while(k > 0)//同上
{
counter[k % 10]++;
k /= 10;
}
for (int i = 1;i < 10;i++)//当1~9任何一个数字出现次数不为1的时候返回false
{
if (counter[i] != 1) return false;
}
return counter[0] == 0;//避免数字0的出现
}