首先乘积和两个乘数的位数之和为9,由此可以推出乘积的位数应该在4位或5位,因此乘积>98765(有不重复数字的要求)的情况直接跳过。 而灵活运用set、tuple、tie可以便捷存储以及打印

同时要注意set中存放排列式的顺序,这里set是按照每个tuple中第一个元素的大小升序排列的(自动)

代码1:

#include<bits/stdc++.h>
using namespace std;
bool isValid(int a,int b)
{
    int product = a*b;
    string s1 = to_string(a) + to_string(b) + to_string(product);
    if(s1.length()!=9)return false;
    sort(s1.begin(),s1.end());
    return s1 == "123456789";

}
int main()
{
    set<tuple<int,int,int>> x;
    for (int i=1;i<10000;i++)
    {
        for(int j=i;j<10000;j++)
        {
            int product = i*j;
            if(product>98765)
                break;
            if(isValid(i, j))
                x.insert({product,i,j});
        }
    }
    for(const auto& m:x)
    {
        int product,a,b;
        tie(product,a,b) = m;
        cout<<product<<" = "<<a<<" x "<<b<<endl;    
    }
    return 0;
}

代码二

#include<bits/stdc++.h>
using namespace std;
bool comp(int x,int y){
    int product = x*y;
    string s1 = to_string(x) + to_string(y) + to_string(product);
    if(s1.length()!=9)
        return false;
    else{
        sort(s1.begin(),s1.end(),less<char>());//默认从小到大排序
        if(s1=="123456789")
            return true;
        else 
            return false;
    }
}
int main(){
    vector<tuple<int,int,int>> v1;
    for(int i=1;i<100;i++)
    {
        for(int j=i+1;j<10000;j++)
        {
            if(comp(i,j))
                v1.push_back(make_tuple(i*j,i,j));
        }
    }
    sort(v1.begin(),v1.end());
    for(int num=0;num<v1.size();num++){
        int product,x,y;
        tie(product,x,y) = v1[num];
        cout<<product<<" = "<<x<<" x "<<y<<endl;
    }
    return 0;
}